Skip to content

Instantly share code, notes, and snippets.

@fabien
Last active October 13, 2015 20:26
Show Gist options
  • Save fabien/126ccfaca48ddf1cefb8 to your computer and use it in GitHub Desktop.
Save fabien/126ccfaca48ddf1cefb8 to your computer and use it in GitHub Desktop.
module.exports = function(Model, options) {
if (!options.rel) throw new Error('Mixin: cascade delete - no relation specified');
var _ = require('lodash');
var async = require('async');
var beforeDelete = options.before || function(inst, next) {
process.nextTick(function() { next(null, true); });
};
var relation = _.find(Model.relations, function(rel) {
return rel.name === options.rel;
});
if (!relation) throw new Error('Mixin: cascade delete - relation not found: ' + options.rel);
if (relation.type === 'referencesMany') throw new Error('Mixin: cascade delete - referencesMany is not supported');
var pk = relation.keyFrom;
var fk = relation.keyTo;
var TargetModel = relation.modelTo;
Model.on('deleted', function(id) {
var filter = { where: {} };
filter.where[fk] = id;
var inst = {};
inst[pk] = id;
relation.applyScope(inst, filter);
TargetModel.find(filter, function(err, items) {
async.map(items || [], function(inst, next) {
beforeDelete(inst, function(err, del) {
if (err || !inst || !del) return next();
inst.destroy(function(err) {
next(err, inst);
});
});
}, function(err, results) {
if (_.isFunction(options.after)) {
options.after(err, _.compact(results));
}
});
});
});
};
// models/product.js
module.exports = function(Product, Base) {
Product.mixin('Cascading', { model: Image });
};
@offlinehacker
Copy link

Is this implemented somewhere?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment