UNPKG

jugglingdb

Version:

Node.js ORM for every database: redis, mysql, mongodb, postgres, sqlite, ...

69 lines (62 loc) 1.87 kB
/** * 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); }