forest-express-sequelize
Version:
Official Express/Sequelize Liana for Forest
108 lines (107 loc) • 6.06 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
require("core-js/modules/es.array.iterator.js");
require("core-js/modules/es.promise.js");
var _forestExpress = require("forest-express");
var _lodash = _interopRequireDefault(require("lodash"));
var _moment = _interopRequireDefault(require("moment"));
var _database = require("../utils/database");
var _orm = _interopRequireWildcard(require("../utils/orm"));
var _queryOptions = _interopRequireDefault(require("./query-options"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
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; }
// NOTICE: These aliases are not camelcased to prevent issues with Sequelize.
const ALIAS_GROUP_BY = 'forest_alias_groupby';
const ALIAS_AGGREGATE = 'forest_alias_aggregate';
function PieStatGetter(model, params, options, user) {
const needsDateOnlyFormating = (0, _orm.isVersionLessThan)(options.Sequelize, '4.0.0');
const schema = _forestExpress.Schemas.schemas[model.name];
let associationSplit;
let associationCollection;
let associationField;
let associationSchema;
let field;
if (params.groupByFieldName.indexOf(':') === -1) {
field = _lodash.default.find(schema.fields, function (currentField) {
return currentField.field === params.groupByFieldName;
});
} else {
associationSplit = params.groupByFieldName.split(':');
associationCollection = model.associations[associationSplit[0]].target.name;
[, associationField] = associationSplit;
associationSchema = _forestExpress.Schemas.schemas[associationCollection];
field = _lodash.default.find(associationSchema.fields, function (currentField) {
return currentField.field === associationField;
});
}
function getGroupByField() {
if (params.groupByFieldName.includes(':')) {
const [associationName, fieldName] = params.groupByFieldName.split(':');
return `${associationName}.${_orm.default.getColumnName(associationSchema, fieldName)}`;
}
return `${schema.name}.${_orm.default.getColumnName(schema, params.groupByFieldName)}`;
}
const groupByField = getGroupByField();
function getAggregate() {
return params.aggregator.toLowerCase();
}
function getAggregateField() {
// NOTICE: As MySQL cannot support COUNT(table_name.*) syntax, fieldName cannot be '*'.
const fieldName = params.aggregateFieldName || schema.primaryKeys[0] || schema.fields[0].field;
return `${schema.name}.${_orm.default.getColumnName(schema, fieldName)}`;
}
function getGroupBy() {
return (0, _database.isMSSQL)(model.sequelize) ? [options.Sequelize.col(groupByField)] : [ALIAS_GROUP_BY];
}
function formatResults(records) {
return records.map(function (record) {
let key;
if (field.type === 'Date') {
key = (0, _moment.default)(record[ALIAS_GROUP_BY]).format('DD/MM/YYYY HH:mm:ss');
} else if (field.type === 'Dateonly' && needsDateOnlyFormating) {
const offsetServer = (0, _moment.default)().utcOffset() / 60;
const dateonly = _moment.default.utc(record[ALIAS_GROUP_BY]).add(offsetServer, 'h');
key = dateonly.format('DD/MM/YYYY');
} else {
key = String(record[ALIAS_GROUP_BY]);
}
return {
key,
value: record[ALIAS_AGGREGATE]
};
});
}
this.perform = async function () {
const {
filter,
timezone
} = params;
const scopeFilters = await _forestExpress.scopeManager.getScopeForUser(user, model.name, true);
const queryOptions = new _queryOptions.default(model, {
includeRelations: true
});
await queryOptions.filterByConditionTree(filter, timezone);
await queryOptions.filterByConditionTree(scopeFilters, timezone);
const sequelizeOptions = _objectSpread(_objectSpread({}, queryOptions.sequelizeOptions), {}, {
attributes: [[options.Sequelize.col(groupByField), ALIAS_GROUP_BY], [options.Sequelize.fn(getAggregate(), options.Sequelize.col(getAggregateField())), ALIAS_AGGREGATE]],
group: getGroupBy(),
order: [[options.Sequelize.literal(ALIAS_AGGREGATE), 'DESC']],
raw: true
});
if (sequelizeOptions.include) {
sequelizeOptions.include = sequelizeOptions.include.map(function (includeProperties) {
return _objectSpread(_objectSpread({}, includeProperties), {}, {
attributes: []
});
});
}
const records = await model.unscoped().findAll(sequelizeOptions);
return {
value: formatResults(records)
};
};
}
module.exports = PieStatGetter;
;