forest-express
Version:
Official package for all Forest Express Lianas
224 lines (223 loc) • 10.6 kB
JavaScript
;
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);
};
};