forest-express-sequelize
Version:
Official Express/Sequelize Liana for Forest
102 lines (96 loc) • 4.55 kB
JavaScript
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;
;