UNPKG

forest-express-sequelize

Version:

Official Express/Sequelize Liana for Forest

108 lines (107 loc) 6.06 kB
"use strict"; 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;