forest-express
Version:
Official package for all Forest Express Lianas
187 lines (180 loc) • 7.86 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _require = require('@forestadmin/context'),
inject = _require.inject;
/**
* This class generates routes for handling smart actions' form hooks and legacy routes.
*/
var Actions = /*#__PURE__*/function () {
function Actions() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : inject(),
logger = _ref.logger,
pathService = _ref.pathService,
stringUtils = _ref.stringUtils,
schemasGenerator = _ref.schemasGenerator,
smartActionHookService = _ref.smartActionHookService,
smartActionHookDeserializer = _ref.smartActionHookDeserializer;
(0, _classCallCheck2["default"])(this, Actions);
this.path = pathService;
this.logger = logger;
this.stringUtils = stringUtils;
this.schemasGenerator = schemasGenerator;
this.smartActionHookService = smartActionHookService;
this.smartActionHookDeserializer = smartActionHookDeserializer;
}
/**
* Generate a callback for express that handles the `load` hook.
*
* @param {Object} action The smart action
* @returns {Function} A route callback for express
*/
(0, _createClass2["default"])(Actions, [{
key: "getHookLoadController",
value: function getHookLoadController(action) {
var _this = this;
return /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, response) {
var hookResponse;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return _this.smartActionHookService.getResponse(action, action.hooks.load, structuredClone(action.fields), request);
case 3:
hookResponse = _context.sent;
return _context.abrupt("return", response.status(200).send(hookResponse));
case 7:
_context.prev = 7;
_context.t0 = _context["catch"](0);
_this.logger.error('Error in smart load action hook: ', _context.t0);
return _context.abrupt("return", response.status(500).send({
message: _context.t0.message
}));
case 11:
case "end":
return _context.stop();
}
}, _callee, null, [[0, 7]]);
}));
return function (_x, _x2) {
return _ref2.apply(this, arguments);
};
}();
}
/**
* Generate a callback for express that handles the `change` hook.
*
* @param {Object} action The smart action
* @returns {Function} A route callback for express
*/
}, {
key: "getHookChangeController",
value: function getHookChangeController(action) {
var _this2 = this;
return /*#__PURE__*/function () {
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request, response) {
var data, fields, changedField, fieldChanged, hookResponse;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
_context2.prev = 0;
data = _this2.smartActionHookDeserializer.deserialize(request.body);
fields = data.fields, changedField = data.changedField;
fieldChanged = fields.find(function (field) {
return field.field === changedField;
});
_context2.next = 6;
return _this2.smartActionHookService.getResponse(action, action.hooks.change[fieldChanged === null || fieldChanged === void 0 ? void 0 : fieldChanged.hook], fields, request, fieldChanged);
case 6:
hookResponse = _context2.sent;
return _context2.abrupt("return", response.status(200).send(hookResponse));
case 10:
_context2.prev = 10;
_context2.t0 = _context2["catch"](0);
_this2.logger.error('Error in smart action change hook: ', _context2.t0);
return _context2.abrupt("return", response.status(500).send({
message: _context2.t0.message
}));
case 14:
case "end":
return _context2.stop();
}
}, _callee2, null, [[0, 10]]);
}));
return function (_x3, _x4) {
return _ref3.apply(this, arguments);
};
}();
}
/**
* Generate path for a smart action route.
*
* @param {*} action The smart action
* @param {String} path The path to the hook
* @param {*} options Environement actions
* @returns {String} The generated path
*/
}, {
key: "getRoute",
value: function getRoute(action, path, options) {
if (action.endpoint) {
return this.path.generateForSmartActionCustomEndpoint("".concat(action.endpoint, "/").concat(path), options);
}
var actionName = this.stringUtils.parameterize(action.name);
return this.path.generate("actions/".concat(actionName, "/").concat(path), options);
}
/**
* Build routes for each form hooks and legacy values routes.
*
* @param {Array} actions list of actions
*/
}, {
key: "buildRoutes",
value: function buildRoutes(actions) {
var _this3 = this;
var createDynamicRoute = function createDynamicRoute(route, controller) {
return _this3.app.post(route, _this3.auth.ensureAuthenticated, controller);
};
actions.forEach(function (action) {
// Create a `load` routes for smart actions.
// One route is created for each action which have a `hooks.load` property.
if (action.hooks && action.hooks.load) {
createDynamicRoute(_this3.getRoute(action, 'hooks/load', _this3.options), _this3.getHookLoadController(action));
}
// Create a `change` routes for smart actions.
// One route is created for each action which have a `hooks.change` property.
if (action.hooks && action.hooks.change) {
createDynamicRoute(_this3.getRoute(action, 'hooks/change', _this3.options), _this3.getHookChangeController(action));
}
});
}
/**
* Generate routes for smart action hooks (and the legacy values object).
*
* @param {*} app Express instance (route are attached to this object)
* @param {*} schema The schema (collection) associated with the action
* @param {*} model The model associated with the action (is undefined for smart collection)
* @param {*} Implementation Gives access to current Implementation (mongoose or sequelize)
* @param {*} options Environment options
* @param {*} auth Auth instance
*/
}, {
key: "perform",
value: function perform(app, schema, model, Implementation, options, auth) {
this.implementation = Implementation;
this.model = model;
this.app = app;
this.options = options;
this.auth = auth;
if (!schema || !schema.actions) return;
this.buildRoutes(schema.actions);
}
}]);
return Actions;
}();
module.exports = Actions;