Last active
October 13, 2015 20:26
-
-
Save fabien/126ccfaca48ddf1cefb8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Is this implemented somewhere?