forest-express
Version:
Official package for all Forest Express Lianas
211 lines (209 loc) • 12.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
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; }
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; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var _require = require('lodash'),
pick = _require.pick;
var _require2 = require('@forestadmin/context'),
inject = _require2.inject;
var ParamsFieldsDeserializer = require('../../deserializers/params-fields');
var QueryDeserializer = require('../../deserializers/query');
var Schemas = require('../../generators/schemas');
var AbstractRecordService = require('./abstract-records-service');
var RecordsGetter = /*#__PURE__*/function (_AbstractRecordServic) {
(0, _inherits2["default"])(RecordsGetter, _AbstractRecordServic);
var _super = _createSuper(RecordsGetter);
function RecordsGetter() {
(0, _classCallCheck2["default"])(this, RecordsGetter);
return _super.apply(this, arguments);
}
(0, _createClass2["default"])(RecordsGetter, [{
key: "getAll",
value:
/**
* @param extraParams Deprecated. Should be removed for forest-express@10
*/
function () {
var _getAll = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
var extraParams,
ResourcesGetter,
params,
getter,
_yield$getter$perform,
_yield$getter$perform2,
records,
fieldsSearched,
_args = arguments;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
extraParams = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
ResourcesGetter = this.Implementation.ResourcesGetter; // Load records
params = _objectSpread(_objectSpread({}, this.params), extraParams);
getter = new ResourcesGetter(this.model, this.lianaOptions, params, this.user);
_context.next = 6;
return getter.perform();
case 6:
_yield$getter$perform = _context.sent;
_yield$getter$perform2 = (0, _slicedToArray2["default"])(_yield$getter$perform, 2);
records = _yield$getter$perform2[0];
fieldsSearched = _yield$getter$perform2[1];
// Save search value and searched fields for 'meta' generation on serialization
// (used for search highlighting on the frontend).
this.searchValue = params.search;
this.fieldsSearched = fieldsSearched;
// Save list of requested fields for smartfield serialization
this.fieldsPerModel = new ParamsFieldsDeserializer(params.fields).perform();
return _context.abrupt("return", records);
case 14:
case "end":
return _context.stop();
}
}, _callee, this);
}));
function getAll() {
return _getAll.apply(this, arguments);
}
return getAll;
}()
/**
* Takes a request from a frontend bulk action (bulk smart-action, bulk delete, ...) and
* returns the list of ids that should be affected.
*
* @fixme why are we testing for attrs?.allRecords !== true && attrs.ids to detect "all records"
* queries? IMHO this should be only attrs?.allRecords
*
* @fixme Composite ids are returned separated by a dash "-".
* I am not sure why: those ids won't be compatible with those used in
* forest-express-sequelize which are using pipes "|".
*/
}, {
key: "getIdsFromRequest",
value: function () {
var _getIdsFromRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request) {
var _request$body$data$at,
_request$body,
_request$body$data,
_attrs$allRecordsIdsE,
_attrs$allRecordsIdsE2,
_attrs$allRecordsIdsE3,
_this = this;
var _inject, env, attrs, idsExcludedAsString, ids, pageSize, pageNo, done, records, recordIds;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_inject = inject(), env = _inject.env;
attrs = new QueryDeserializer((_request$body$data$at = request === null || request === void 0 ? void 0 : (_request$body = request.body) === null || _request$body === void 0 ? void 0 : (_request$body$data = _request$body.data) === null || _request$body$data === void 0 ? void 0 : _request$body$data.attributes) !== null && _request$body$data$at !== void 0 ? _request$body$data$at : {}).perform();
idsExcludedAsString = (_attrs$allRecordsIdsE = attrs === null || attrs === void 0 ? void 0 : (_attrs$allRecordsIdsE2 = attrs.allRecordsIdsExcluded) === null || _attrs$allRecordsIdsE2 === void 0 ? void 0 : (_attrs$allRecordsIdsE3 = _attrs$allRecordsIdsE2.map) === null || _attrs$allRecordsIdsE3 === void 0 ? void 0 : _attrs$allRecordsIdsE3.call(_attrs$allRecordsIdsE2, String)) !== null && _attrs$allRecordsIdsE !== void 0 ? _attrs$allRecordsIdsE : []; // "select all records" is not selected
if (!((attrs === null || attrs === void 0 ? void 0 : attrs.allRecords) !== true && attrs.ids)) {
_context2.next = 5;
break;
}
return _context2.abrupt("return", attrs.ids);
case 5:
// Otherwise, query database in a loop to retrieve all ids.
ids = [];
pageSize = Number(env === null || env === void 0 ? void 0 : env.FOREST_IDS_PAGE_SIZE) || 4000;
pageNo = 1, done = false;
case 8:
if (done) {
_context2.next = 18;
break;
}
_context2.next = 11;
return this._loadPage(attrs, pageNo, pageSize);
case 11:
records = _context2.sent;
recordIds = records.map(function (record) {
return _this._extractPackedPrimaryKey(record);
}).filter(function (id) {
return !idsExcludedAsString.includes(String(id));
});
ids.push.apply(ids, (0, _toConsumableArray2["default"])(recordIds));
done = records.length < pageSize;
case 15:
pageNo += 1;
_context2.next = 8;
break;
case 18:
return _context2.abrupt("return", ids);
case 19:
case "end":
return _context2.stop();
}
}, _callee2, this);
}));
function getIdsFromRequest(_x) {
return _getIdsFromRequest.apply(this, arguments);
}
return getIdsFromRequest;
}() /** @private helper function for getIdsFromRequest */
}, {
key: "_loadPage",
value: function () {
var _loadPage2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(attrs, pageNo, pageSize) {
var _this$Implementation, ResourcesGetter, HasManyGetter, getModelName, primaryKeys, params, loader, parentModel;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
_this$Implementation = this.Implementation, ResourcesGetter = _this$Implementation.ResourcesGetter, HasManyGetter = _this$Implementation.HasManyGetter, getModelName = _this$Implementation.getModelName;
primaryKeys = Schemas.schemas[getModelName(this.model)].primaryKeys;
params = _objectSpread(_objectSpread(_objectSpread({}, pick(this.params, ['timezone'])), pick(attrs.allRecordsSubsetQuery, ['filters', 'search', 'searchExtended', 'segment', 'segmentQuery', 'timezone'])), {}, {
// Ideally we would prefer specifying all primary keys but that's not supported.
sort: primaryKeys[0],
page: {
number: pageNo,
size: pageSize
},
// We only need the primary keys
restrictFieldsOnRootModel: true,
fields: (0, _defineProperty2["default"])({}, getModelName(this.model), primaryKeys.join(','))
});
if (attrs.parentCollectionName && attrs.parentCollectionId && attrs.parentAssociationName) {
parentModel = this.modelsManager.getModelByName(attrs.parentCollectionName);
params.recordId = attrs.parentCollectionId;
params.associationName = attrs.parentAssociationName;
loader = new HasManyGetter(parentModel, this.model, this.lianaOptions, params, this.user);
} else {
loader = new ResourcesGetter(this.model, this.lianaOptions, params, this.user);
}
_context3.next = 6;
return loader.perform();
case 6:
return _context3.abrupt("return", _context3.sent[0]);
case 7:
case "end":
return _context3.stop();
}
}, _callee3, this);
}));
function _loadPage(_x2, _x3, _x4) {
return _loadPage2.apply(this, arguments);
}
return _loadPage;
}() /** @private helper function for getIdsFromRequest */
}, {
key: "_extractPackedPrimaryKey",
value: function _extractPackedPrimaryKey(record) {
var getModelName = this.Implementation.getModelName;
var primaryKeys = Schemas.schemas[getModelName(this.model)].primaryKeys;
return primaryKeys.map(function (primaryKey) {
return record[primaryKey];
}).join('-');
}
}]);
return RecordsGetter;
}(AbstractRecordService);
module.exports = RecordsGetter;