UNPKG

@loudsrl/loopback-cascade-delete-mixin

Version:

Loopback cascade delete mixin

178 lines (133 loc) 14.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _promise = require('babel-runtime/core-js/promise'); var _promise2 = _interopRequireDefault(_promise); var _debug2 = require('./debug'); var _debug3 = _interopRequireDefault(_debug2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var debug = (0, _debug3.default)(); var idName = function idName(m) { return m.definition.idName() || 'id'; }; var getIdValue = function getIdValue(m, data) { return data && data[idName(m)]; }; var cascadeDeletes = function cascadeDeletes(modelId, Model, options) { return _promise2.default.all(options.relations.map(function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(relationData) { var relation, relationForeignKey, relationDeepDelete, relationModel, relationKey, where, instancesToDelete; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: relation = void 0; relationForeignKey = void 0; relationDeepDelete = void 0; if (relationData instanceof Object) { relation = relationData.name; relationForeignKey = relationData.foreignKey; relationDeepDelete = relationData.deepDelete; } else relation = relationData; if (relation) { _context2.next = 6; break; } throw new Error('Please, set relation name! loopback-cascade-mixin'); case 6: debug('Relation ' + relation + ' model ' + Model.definition.name); if (Model.relations[relation]) { _context2.next = 10; break; } debug('Relation ' + relation + ' not found for model ' + Model.definition.name); throw new Error('Relation ' + relation + ' not found for model ' + Model.definition.name); case 10: relationModel = Model.relations[relation].modelTo; relationKey = relationForeignKey || Model.relations[relation].keyTo; if (Model.relations[relation].modelThrough) { relationModel = Model.relations[relation].modelThrough; } if (relationModel.definition.properties[relationKey]) { _context2.next = 15; break; } throw new Error('Bad relation key name! \n ' + Model.definition.name + ' - ' + relationModel.definition.name + ' \n loopback cascade-delete-mixin'); case 15: where = {}; where[relationKey] = modelId; if (!(relationDeepDelete || relationDeepDelete && options.deepDelete)) { _context2.next = 24; break; } _context2.next = 20; return relationModel.find({ where: where }); case 20: instancesToDelete = _context2.sent; instancesToDelete.forEach(function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(instance) { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return instance.destroy(); case 2: case 'end': return _context.stop(); } } }, _callee, undefined); })); return function (_x2) { return _ref2.apply(this, arguments); }; }()); _context2.next = 26; break; case 24: _context2.next = 26; return relationModel.destroyAll(where); case 26: case 'end': return _context2.stop(); } } }, _callee2, undefined); })); return function (_x) { return _ref.apply(this, arguments); }; }())); }; exports.default = function (Model, options) { Model.observe('before delete', function (ctx) { var name = idName(Model); var hasInstanceId = ctx.instance && ctx.instance[name]; var hasWhereId = ctx.where && ctx.where[name]; var hasMixinOption = options && Array.isArray(options.relations); if (!(hasWhereId || hasInstanceId)) { debug('Skipping delete for ', Model.definition.name); return _promise2.default.resolve(); } if (!hasMixinOption) { debug('Skipping delete for', Model.definition.name, 'Please add mixin options'); return _promise2.default.resolve(); } var modelInstanceId = getIdValue(Model, ctx.instance || ctx.where); return cascadeDeletes(modelInstanceId, Model, options).then(function () { debug('Cascade delete has successfully finished'); return true; }).catch(function (err) { debug('Error with cascading deletes', err); return _promise2.default.reject(err); }); }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhc2NhZGUtZGVsZXRlLmpzIl0sIm5hbWVzIjpbImRlYnVnIiwiaWROYW1lIiwibSIsImRlZmluaXRpb24iLCJnZXRJZFZhbHVlIiwiZGF0YSIsImNhc2NhZGVEZWxldGVzIiwibW9kZWxJZCIsIk1vZGVsIiwib3B0aW9ucyIsImFsbCIsInJlbGF0aW9ucyIsIm1hcCIsInJlbGF0aW9uRGF0YSIsInJlbGF0aW9uIiwicmVsYXRpb25Gb3JlaWduS2V5IiwicmVsYXRpb25EZWVwRGVsZXRlIiwiT2JqZWN0IiwibmFtZSIsImZvcmVpZ25LZXkiLCJkZWVwRGVsZXRlIiwiRXJyb3IiLCJyZWxhdGlvbk1vZGVsIiwibW9kZWxUbyIsInJlbGF0aW9uS2V5Iiwia2V5VG8iLCJtb2RlbFRocm91Z2giLCJwcm9wZXJ0aWVzIiwid2hlcmUiLCJmaW5kIiwiaW5zdGFuY2VzVG9EZWxldGUiLCJmb3JFYWNoIiwiaW5zdGFuY2UiLCJkZXN0cm95IiwiZGVzdHJveUFsbCIsIm9ic2VydmUiLCJjdHgiLCJoYXNJbnN0YW5jZUlkIiwiaGFzV2hlcmVJZCIsImhhc01peGluT3B0aW9uIiwiQXJyYXkiLCJpc0FycmF5IiwicmVzb2x2ZSIsIm1vZGVsSW5zdGFuY2VJZCIsInRoZW4iLCJjYXRjaCIsImVyciIsInJlamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7OztBQUVBLElBQU1BLFFBQVEsc0JBQWQ7O0FBRUEsSUFBTUMsU0FBUyxTQUFUQSxNQUFTO0FBQUEsU0FBS0MsRUFBRUMsVUFBRixDQUFhRixNQUFiLE1BQXlCLElBQTlCO0FBQUEsQ0FBZjtBQUNBLElBQU1HLGFBQWEsU0FBYkEsVUFBYSxDQUFDRixDQUFELEVBQUlHLElBQUo7QUFBQSxTQUFhQSxRQUFRQSxLQUFLSixPQUFPQyxDQUFQLENBQUwsQ0FBckI7QUFBQSxDQUFuQjs7QUFFQSxJQUFNSSxpQkFBaUIsU0FBakJBLGNBQWlCLENBQUNDLE9BQUQsRUFBVUMsS0FBVixFQUFpQkMs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QUFhUSxJQUFJUixLQUFKLENBQVVWLElBQVYsQ0FBaEM7QUFDQSxRQUFNcUIsaUJBQWlCOUIsV0FBVytCLE1BQU1DLE9BQU4sQ0FBY2hDLFFBQVFFLFNBQXRCLENBQWxDOztBQUVBLFFBQUksRUFBRTJCLGNBQWNELGFBQWhCLENBQUosRUFBb0M7QUFDbENyQyxZQUFNLHNCQUFOLEVBQThCUSxNQUFNTCxVQUFOLENBQWlCZSxJQUEvQztBQUNBLGFBQU8sa0JBQVF3QixPQUFSLEVBQVA7QUFDRDs7QUFFRCxRQUFJLENBQUNILGNBQUwsRUFBcUI7QUFDbkJ2QyxZQUFNLHFCQUFOLEVBQTZCUSxNQUFNTCxVQUFOLENBQWlCZSxJQUE5QyxFQUFvRCwwQkFBcEQ7QUFDQSxhQUFPLGtCQUFRd0IsT0FBUixFQUFQO0FBQ0Q7O0FBRUQsUUFBTUMsa0JBQWtCdkMsV0FBV0ksS0FBWCxFQUFrQjRCLElBQUlKLFFBQUosSUFBZ0JJLElBQUlSLEtBQXRDLENBQXhCOztBQUVBLFdBQU90QixlQUFlcUMsZUFBZixFQUFnQ25DLEtBQWhDLEVBQXVDQyxPQUF2QyxFQUNKbUMsSUFESSxDQUNDLFlBQU07QUFDVjVDLFlBQU0sMENBQU47QUFDQSxhQUFPLElBQVA7QUFDRCxLQUpJLEVBS0o2QyxLQUxJLENBS0UsVUFBQ0MsR0FBRCxFQUFTO0FBQ2Q5QyxZQUFNLDhCQUFOLEVBQXNDOEMsR0FBdEM7QUFDQSxhQUFPLGtCQUFRQyxNQUFSLENBQWVELEdBQWYsQ0FBUDtBQUNELEtBUkksQ0FBUDtBQVNELEdBM0JEO0FBNEJELEMiLCJmaWxlIjoiY2FzY2FkZS1kZWxldGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlYnVnIGZyb20gJy4vZGVidWcnO1xuXG5jb25zdCBkZWJ1ZyA9IF9kZWJ1ZygpO1xuXG5jb25zdCBpZE5hbWUgPSBtID0+IG0uZGVmaW5pdGlvbi5pZE5hbWUoKSB8fCAnaWQnO1xuY29uc3QgZ2V0SWRWYWx1ZSA9IChtLCBkYXRhKSA9PiBkYXRhICYmIGRhdGFbaWROYW1lKG0pXTtcblxuY29uc3QgY2FzY2FkZURlbGV0ZXMgPSAobW9kZWxJZCwgTW9kZWwsIG9wdGlvbnMpID0+XG4gIFByb21pc2UuYWxsKG9wdGlvbnMucmVsYXRpb25zLm1hcChhc3luYyAocmVsYXRpb25EYXRhKSA9PiB7XG4gICAgbGV0IHJlbGF0aW9uO1xuICAgIGxldCByZWxhdGlvbkZvcmVpZ25LZXk7XG4gICAgbGV0IHJlbGF0aW9uRGVlcERlbGV0ZTtcblxuICAgIGlmIChyZWxhdGlvbkRhdGEgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHJlbGF0aW9uID0gcmVsYXRpb25EYXRhLm5hbWU7XG4gICAgICByZWxhdGlvbkZvcmVpZ25LZXkgPSByZWxhdGlvbkRhdGEuZm9yZWlnbktleTtcbiAgICAgIHJlbGF0aW9uRGVlcERlbGV0ZSA9IHJlbGF0aW9uRGF0YS5kZWVwRGVsZXRlO1xuICAgIH0gZWxzZSByZWxhdGlvbiA9IHJlbGF0aW9uRGF0YTtcblxuICAgIGlmICghcmVsYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlLCBzZXQgcmVsYXRpb24gbmFtZSEgbG9vcGJhY2stY2FzY2FkZS1taXhpbicpO1xuICAgIH1cblxuICAgIGRlYnVnKGBSZWxhdGlvbiAke3JlbGF0aW9ufSBtb2RlbCAke01vZGVsLmRlZmluaXRpb24ubmFtZX1gKTtcblxuICAgIGlmICghTW9kZWwucmVsYXRpb25zW3JlbGF0aW9uXSkge1xuICAgICAgZGVidWcoYFJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZCBmb3IgbW9kZWwgJHtNb2RlbC5kZWZpbml0aW9uLm5hbWV9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZCBmb3IgbW9kZWwgJHtNb2RlbC5kZWZpbml0aW9uLm5hbWV9YCk7XG4gICAgfVxuXG5cbiAgICBsZXQgcmVsYXRpb25Nb2RlbCA9IE1vZGVsLnJlbGF0aW9uc1tyZWxhdGlvbl0ubW9kZWxUbztcbiAgICBjb25zdCByZWxhdGlvbktleSA9IHJlbGF0aW9uRm9yZWlnbktleSB8fCBNb2RlbC5yZWxhdGlvbnNbcmVsYXRpb25dLmtleVRvO1xuXG4gICAgaWYgKE1vZGVsLnJlbGF0aW9uc1tyZWxhdGlvbl0ubW9kZWxUaHJvdWdoKSB7XG4gICAgICByZWxhdGlvbk1vZGVsID0gTW9kZWwucmVsYXRpb25zW3JlbGF0aW9uXS5tb2RlbFRocm91Z2g7XG4gICAgfVxuXG4gICAgaWYgKCFyZWxhdGlvbk1vZGVsLmRlZmluaXRpb24ucHJvcGVydGllc1tyZWxhdGlvbktleV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQmFkIHJlbGF0aW9uIGtleSBuYW1lISBcbiAgICAgICR7TW9kZWwuZGVmaW5pdGlvbi5uYW1lfSAtICR7cmVsYXRpb25Nb2RlbC5kZWZpbml0aW9uLm5hbWV9IFxuICAgICAgbG9vcGJhY2sgY2FzY2FkZS1kZWxldGUtbWl4aW5gKTtcbiAgICB9XG5cblxuICAgIGNvbnN0IHdoZXJlID0ge307XG4gICAgd2hlcmVbcmVsYXRpb25LZXldID0gbW9kZWxJZDtcblxuICAgIGlmIChyZWxhdGlvbkRlZXBEZWxldGUgfHwgKHJlbGF0aW9uRGVlcERlbGV0ZSAmJiBvcHRpb25zLmRlZXBEZWxldGUpKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZXNUb0RlbGV0ZSA9IGF3YWl0IHJlbGF0aW9uTW9kZWwuZmluZCh7IHdoZXJlIH0pO1xuXG4gICAgICBpbnN0YW5jZXNUb0RlbGV0ZS5mb3JFYWNoKGFzeW5jIChpbnN0YW5jZSkgPT4ge1xuICAgICAgICBhd2FpdCBpbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgcmVsYXRpb25Nb2RlbC5kZXN0cm95QWxsKHdoZXJlKTtcbiAgICB9XG4gIH0pKTtcblxuZXhwb3J0IGRlZmF1bHQgKE1vZGVsLCBvcHRpb25zKSA9PiB7XG4gIE1vZGVsLm9ic2VydmUoJ2FmdGVyIGRlbGV0ZScsIChjdHgpID0+IHtcbiAgICBjb25zdCBuYW1lID0gaWROYW1lKE1vZGVsKTtcbiAgICBjb25zdCBoYXNJbnN0YW5jZUlkID0gY3R4Lmluc3RhbmNlICYmIGN0eC5pbnN0YW5jZVtuYW1lXTtcbiAgICBjb25zdCBoYXNXaGVyZUlkID0gY3R4LndoZXJlICYmIGN0eC53aGVyZVtuYW1lXTtcbiAgICBjb25zdCBoYXNNaXhpbk9wdGlvbiA9IG9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShvcHRpb25zLnJlbGF0aW9ucyk7XG5cbiAgICBpZiAoIShoYXNXaGVyZUlkIHx8IGhhc0luc3RhbmNlSWQpKSB7XG4gICAgICBkZWJ1ZygnU2tpcHBpbmcgZGVsZXRlIGZvciAnLCBNb2RlbC5kZWZpbml0aW9uLm5hbWUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlmICghaGFzTWl4aW5PcHRpb24pIHtcbiAgICAgIGRlYnVnKCdTa2lwcGluZyBkZWxldGUgZm9yJywgTW9kZWwuZGVmaW5pdGlvbi5uYW1lLCAnUGxlYXNlIGFkZCBtaXhpbiBvcHRpb25zJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxJbnN0YW5jZUlkID0gZ2V0SWRWYWx1ZShNb2RlbCwgY3R4Lmluc3RhbmNlIHx8IGN0eC53aGVyZSk7XG5cbiAgICByZXR1cm4gY2FzY2FkZURlbGV0ZXMobW9kZWxJbnN0YW5jZUlkLCBNb2RlbCwgb3B0aW9ucylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgZGVidWcoJ0Nhc2NhZGUgZGVsZXRlIGhhcyBzdWNjZXNzZnVsbHkgZmluaXNoZWQnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgZGVidWcoJ0Vycm9yIHdpdGggY2FzY2FkaW5nIGRlbGV0ZXMnLCBlcnIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICB9KTtcbn07XG4iXX0=