jugglingdb
Version:
Node.js ORM for every database: redis, mysql, mongodb, postgres, sqlite, ...
69 lines (62 loc) • 1.87 kB
JavaScript
/**
* Hooks mixins for ./model.js
*/
const Hookable = require('./model.js');
/**
* Module exports
*/
exports.Hookable = Hookable;
/**
* List of hooks available
*/
Hookable.afterInitialize = null;
Hookable.beforeValidate = null;
Hookable.afterValidate = null;
Hookable.beforeSave = null;
Hookable.afterSave = null;
Hookable.beforeCreate = null;
Hookable.afterCreate = null;
Hookable.beforeUpdate = null;
Hookable.afterUpdate = null;
Hookable.beforeDestroy = null;
Hookable.afterDestroy = null;
Hookable.prototype.trigger = function trigger(actionName, work, data, quit) {
const capitalizedName = capitalize(actionName);
let beforeHook = this.constructor['before' + capitalizedName];
let afterHook = this.constructor['after' + capitalizedName];
if (actionName === 'validate') {
beforeHook = beforeHook || this.constructor.beforeValidation;
afterHook = afterHook || this.constructor.afterValidation;
}
const inst = this;
// we only call "before" hook when we have actual action (work) to perform
if (work) {
if (beforeHook) {
// before hook should be called on instance with one param: callback
beforeHook.call(inst, err => {
if (err) {
if (quit) {
quit.call(inst, err);
}
return;
}
// actual action also have one param: callback
work.call(inst, next);
}, data);
} else {
work.call(inst, next);
}
} else {
next();
}
function next(done) {
if (afterHook) {
afterHook.call(inst, done);
} else if (done) {
done.call(this);
}
}
};
function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}