UNPKG

forest-express

Version:

Official package for all Forest Express Lianas

211 lines (209 loc) 12.4 kB
"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;