UNPKG

forest-express

Version:

Official package for all Forest Express Lianas

224 lines (223 loc) 10.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); 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; } var _require = require('@forestadmin/context'), inject = _require.inject; var _ = require('lodash'); var auth = require('../services/auth'); var logger = require('../services/logger'); var error = require('../utils/error'); var path = require('../services/path'); var StatSerializer = require('../serializers/stat'); var PermissionMiddlewareCreator = require('../middlewares/permissions'); var Schemas = require('../generators/schemas'); var CHART_TYPE_VALUE = 'Value'; var CHART_TYPE_PIE = 'Pie'; var CHART_TYPE_LINE = 'Line'; var CHART_TYPE_LEADERBOARD = 'Leaderboard'; var CHART_TYPE_OBJECTIVE = 'Objective'; module.exports = function Stats(app, model, Implementation, opts) { var _this = this; var _inject = inject(), chartHandler = _inject.chartHandler, modelsManager = _inject.modelsManager; var modelName = Implementation.getModelName(model); var permissionMiddlewareCreator = new PermissionMiddlewareCreator(modelName); this.get = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, response, next) { var promise, getAssociationModel, chart, params, type, schema, modelRelationship, statGetterType; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: getAssociationModel = function _getAssociationModel(schema, associationName) { var field = _.find(schema.fields, { field: associationName }); var relatedModelName; if (field && field.reference) { var _field$reference$spli = field.reference.split('.'); var _field$reference$spli2 = (0, _slicedToArray2["default"])(_field$reference$spli, 1); relatedModelName = _field$reference$spli2[0]; } var models = modelsManager.getModels(); return _.find(models, function (currentModel) { return Implementation.getModelName(currentModel) === relatedModelName; }); }; promise = null; _context.next = 4; return chartHandler.getChartWithContextInjected({ userId: request.user.id, renderingId: request.user.renderingId, chartRequest: request.body }); case 4: chart = _context.sent; params = _objectSpread(_objectSpread({ timezone: request.query.timezone }, request.body), chart); type = request.body.type; if (type === CHART_TYPE_LEADERBOARD) { schema = Schemas.schemas[model.name]; modelRelationship = getAssociationModel(schema, request.body.relationshipFieldName); promise = new Implementation.LeaderboardStatGetter(model, modelRelationship, params, request.user).perform(); } else { // Objective chart uses a value stat getter to retrieve the value. statGetterType = type === CHART_TYPE_OBJECTIVE ? CHART_TYPE_VALUE : type; promise = new Implementation["".concat(statGetterType, "StatGetter")](model, params, opts, request.user).perform(); } if (promise) { _context.next = 10; break; } return _context.abrupt("return", response.status(400).send({ error: 'Chart type not found.' })); case 10: return _context.abrupt("return", promise.then(function (stat) { if (type === CHART_TYPE_OBJECTIVE) { stat.value.value = stat.value.countCurrent; delete stat.value.countCurrent; delete stat.value.countPrevious; } return new StatSerializer(stat).perform(); }).then(function (stat) { response.send(stat); })["catch"](next)); case 11: case "end": return _context.stop(); } }, _callee); })); return function (_x, _x2, _x3) { return _ref.apply(this, arguments); }; }(); function getErrorQueryColumnsName(result, keyNames) { var message = "The result columns must be named ".concat(keyNames, " instead of '").concat(Object.keys(result).join('\', \''), "'."); logger.error("Live Query error: ".concat(message)); return new error.UnprocessableEntity(message); } this.getWithLiveQuery = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request, response, next) { var _yield$chartHandler$g, query, contextVariables, result, resultLine, _resultLine, data; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return chartHandler.getQueryForChart({ userId: request.user.id, renderingId: request.user.renderingId, chartRequest: request.body }); case 3: _yield$chartHandler$g = _context2.sent; query = _yield$chartHandler$g.query; contextVariables = _yield$chartHandler$g.contextVariables; _context2.next = 8; return new Implementation.QueryStatGetter(_objectSpread(_objectSpread({}, request.body), {}, { query: query, contextVariables: _objectSpread(_objectSpread({}, request.body.contextVariables || {}), contextVariables) }), opts).perform(); case 8: result = _context2.sent; _context2.t0 = request.body.type; _context2.next = _context2.t0 === CHART_TYPE_VALUE ? 12 : _context2.t0 === CHART_TYPE_PIE ? 20 : _context2.t0 === CHART_TYPE_LEADERBOARD ? 20 : _context2.t0 === CHART_TYPE_LINE ? 22 : _context2.t0 === CHART_TYPE_OBJECTIVE ? 25 : 33; break; case 12: if (!result.length) { _context2.next = 19; break; } resultLine = result[0]; if (!(resultLine.value === undefined)) { _context2.next = 18; break; } throw getErrorQueryColumnsName(resultLine, '\'value\''); case 18: result = { countCurrent: resultLine.value, countPrevious: resultLine.previous }; case 19: return _context2.abrupt("break", 34); case 20: if (result.length) { result.forEach(function (resultLine) { if (resultLine.value === undefined || resultLine.key === undefined) { throw getErrorQueryColumnsName(resultLine, '\'key\', \'value\''); } }); } return _context2.abrupt("break", 34); case 22: if (result.length) { result.forEach(function (resultLine) { if (resultLine.value === undefined || resultLine.key === undefined) { throw getErrorQueryColumnsName(resultLine, '\'key\', \'value\''); } }); } result = result.map(function (resultLine) { return { label: resultLine.key, values: { value: resultLine.value } }; }); return _context2.abrupt("break", 34); case 25: if (!result.length) { _context2.next = 32; break; } _resultLine = result[0]; if (!(_resultLine.value === undefined || _resultLine.objective === undefined)) { _context2.next = 31; break; } throw getErrorQueryColumnsName(_resultLine, '\'value\', \'objective\''); case 31: result = { objective: _resultLine.objective, value: _resultLine.value }; case 32: return _context2.abrupt("break", 34); case 33: throw new Error('Unknown Chart type'); case 34: data = new StatSerializer({ value: result }).perform(); response.send(data); _context2.next = 41; break; case 38: _context2.prev = 38; _context2.t1 = _context2["catch"](0); next(_context2.t1); case 41: case "end": return _context2.stop(); } }, _callee2, null, [[0, 38]]); })); return function (_x4, _x5, _x6) { return _ref2.apply(this, arguments); }; }(); this.perform = function () { app.post(path.generate("stats/".concat(modelName), opts), auth.ensureAuthenticated, permissionMiddlewareCreator.stats(), _this.get); app.post(path.generate('stats', opts), auth.ensureAuthenticated, permissionMiddlewareCreator.stats(), _this.getWithLiveQuery); }; };