UNPKG

forest-express

Version:

Official package for all Forest Express Lianas

187 lines (180 loc) 7.84 kB
"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, 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;