UNPKG

forest-express-sequelize

Version:

Official Express/Sequelize Liana for Forest

102 lines (96 loc) 4.55 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); require("core-js/modules/es.promise.js"); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.regexp.exec.js"); require("core-js/modules/es.array.sort.js"); var _forestExpress = require("forest-express"); var _lodash = _interopRequireDefault(require("lodash")); var _primaryKeysManager = _interopRequireDefault(require("./primary-keys-manager")); var _queryOptions = _interopRequireDefault(require("./query-options")); var _requestedFieldsExtractor = _interopRequireDefault(require("./requested-fields-extractor")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } class ResourcesGetter { constructor(model, lianaOptions, params, user) { // lianaOptions is kept for compatibility with forest-express-mongoose this._model = model.unscoped(); this._params = params; this._user = user; } async perform() { return [await this._getRecords(), await this._getFieldsSearched()]; } /** Count records matching current query (wo/ pagination) */ async count() { const [model, options] = await this._buildQueryOptions({ forCount: true }); // If no primary key is found, use * as a fallback for Sequelize. return model.count(_objectSpread(_objectSpread({}, options), {}, { col: _lodash.default.isEmpty(this._model.primaryKeys) ? '*' : undefined })); } /** Load records matching current query (w/ pagination) */ async _getRecords() { const [model, options] = await this._buildQueryOptions(); const records = await model.findAll(options); new _primaryKeysManager.default(this._model).annotateRecords(records); return records; } /** Get list of fields descriptors which are used when searching (for frontend highlighting). */ async _getFieldsSearched() { const { fields, search, searchExtended } = this._params; const requestedFields = (0, _requestedFieldsExtractor.default)(fields, this._model, _forestExpress.Schemas.schemas); const queryOptions = new _queryOptions.default(this._model); await queryOptions.requireFields(requestedFields); return queryOptions.search(search, searchExtended); } /** Compute query options (shared for count and getRecords) */ async _buildQueryOptions(buildOptions = {}) { const { forCount, tableAlias } = buildOptions; const { fields, filters, search, searchExtended, segment, segmentQuery, timezone } = this._params; const scopeFilters = await _forestExpress.scopeManager.getScopeForUser(this._user, this._model.name, true); const requestedFields = (0, _requestedFieldsExtractor.default)(fields, this._model, _forestExpress.Schemas.schemas); const queryOptions = new _queryOptions.default(this._model, { tableAlias, includeRelations: searchExtended }); if (!forCount) await queryOptions.requireFields(requestedFields); await queryOptions.search(search, searchExtended); await queryOptions.filterByConditionTree(filters, timezone); await queryOptions.filterByConditionTree(scopeFilters, timezone); await queryOptions.segment(segment); await queryOptions.segmentQuery(segmentQuery); if (!forCount) { const { sort, page } = this._params; await queryOptions.sort(sort); await queryOptions.paginate(page === null || page === void 0 ? void 0 : page.number, page === null || page === void 0 ? void 0 : page.size); } return [ // add scopes to model queryOptions.sequelizeScopes.reduce(function (m, scope) { return m.scope(scope); }, this._model), queryOptions.sequelizeOptions]; } } module.exports = ResourcesGetter;