From b7b677e82b6404bcb4de88fb4846ae6c61ddb023 Mon Sep 17 00:00:00 2001 From: Kyriakos Barbounakis Date: Sat, 16 Nov 2024 12:07:33 +0200 Subject: [PATCH] unregister listeners before setting context (#176) * unregister listeners before setting context * unregister after.save listeners * 2.15.1 --- data-model.js | 130 ++++++++++++++++++++++++++++------------------ package-lock.json | 4 +- package.json | 2 +- 3 files changed, 83 insertions(+), 53 deletions(-) diff --git a/data-model.js b/data-model.js index 971a9f5..a185c26 100644 --- a/data-model.js +++ b/data-model.js @@ -282,7 +282,7 @@ function DataModel(obj) { * @type {DataContext} * @private */ - var context_ = null; + var context = null; var self = this; /** @@ -290,17 +290,18 @@ function DataModel(obj) { * @type {DataContext|*} */ - Object.defineProperty(this, 'context', { get: function() { - return context_; - }, set: function(value) { - context_ = value; - if (_.isNil(context_)) { - unregisterContextListeners.bind(this)(); - } - else { - registerContextListeners.bind(this)(); - } - }, enumerable: false, configurable: false}); + Object.defineProperty(this, 'context', { + get: function () { + return context; + }, set: function (value) { + context = value; + // unregister listeners + unregisterContextListeners.call(self); + if (context != null) { + registerContextListeners.call(self); + } + }, enumerable: false, configurable: false + }); /** * @description Gets the database object associated with this data model @@ -594,6 +595,7 @@ function unregisterContextListeners() { this.removeAllListeners('after.remove'); this.removeAllListeners('before.execute'); this.removeAllListeners('after.execute'); + this.removeAllListeners('before.upgrade'); this.removeAllListeners('after.upgrade'); } /** @@ -1857,6 +1859,7 @@ function saveBaseObject_(obj, callback) { }); } } + /** * @this DataModel * @param {*} obj @@ -1893,44 +1896,51 @@ function saveBaseObject_(obj, callback) { target: obj, state:state }; - //register nested objects listener (before save) - self.once('before.save', DataNestedObjectListener.prototype.beforeSave); - //register data association listener (after save) - self.once('after.save', DataNestedObjectListener.prototype.afterSave); - //register data association listener (before save) - self.once('before.save', DataObjectAssociationListener.prototype.beforeSave); - //register data association listener - self.once('after.save', DataObjectAssociationListener.prototype.afterSave); - //register zero or one multiplicity listener - self.once('after.save', ZeroOrOneMultiplicityListener.prototype.afterSave); - //register unique constraint listener at the end of listeners collection (before emit) - self.once('before.save', UniqueConstraintListener.prototype.beforeSave); - //register data validators at the end of listeners collection (before emit) - self.once('before.save', DataValidatorListener.prototype.beforeSave); - //register not null listener at the end of listeners collection (before emit) - self.once('before.save', NotNullConstraintListener.prototype.beforeSave); - //before save (validate permissions) - self.once('before.save', DataPermissionEventListener.prototype.beforeSave); + + var beforeSaveListeners = [ + DataNestedObjectListener.prototype.beforeSave, + DataObjectAssociationListener.prototype.beforeSave, + UniqueConstraintListener.prototype.beforeSave, + DataValidatorListener.prototype.beforeSave, + NotNullConstraintListener.prototype.beforeSave, + DataPermissionEventListener.prototype.beforeSave + ] + var afterSaveListeners = [ + DataNestedObjectListener.prototype.afterSave, + DataObjectAssociationListener.prototype.afterSave, + ZeroOrOneMultiplicityListener.prototype.afterSave + ]; + + beforeSaveListeners.forEach(function(listener) { + self.once('before.save', listener); + }); + + afterSaveListeners.forEach(function(listener) { + self.once('after.save', listener); + }); + //execute before update events self.emit('before.save', e, function(err) { //if an error occurred - self.removeListener('before.save', DataPermissionEventListener.prototype.beforeSave); - self.removeListener('before.save', NotNullConstraintListener.prototype.beforeSave); - self.removeListener('before.save', DataValidatorListener.prototype.beforeSave); - self.removeListener('before.save', UniqueConstraintListener.prototype.beforeSave); - self.removeListener('before.save', DataObjectAssociationListener.prototype.beforeSave); - self.removeListener('before.save', DataNestedObjectListener.prototype.beforeSave); + beforeSaveListeners.forEach(function(listener) { + self.removeListener('before.save', listener); + }); if (err) { + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); //invoke callback with error - callback.call(self, err); + return callback(err); } //otherwise execute save operation else { //save base object if any saveBaseObject_.call(self, e.target, function(err, result) { if (err) { - callback.call(self, err); - return; + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); + return callback(err); } //if result is defined if (result!==undefined) @@ -1961,14 +1971,20 @@ function saveBaseObject_(obj, callback) { //get updated object self.recast(e.target, target, function(err) { if (err) { + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); //and return error - callback.call(self, err); + return callback(err); } else { //execute after update events self.emit('after.save',e, function(err) { + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); //and return - return callback.call(self, err, e.target); + return callback(err, e.target); }); } }); @@ -1987,7 +2003,12 @@ function saveBaseObject_(obj, callback) { nextIdentity = function(a, b, callback) { return callback(); } } nextIdentity.call(db, adapter, pm.name, function(err, insertedId) { - if (err) { return callback.call(self, err); } + if (err) { + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); + return callback(err); + } if (insertedId) { //get object to insert if (q.$insert) { @@ -2000,7 +2021,10 @@ function saveBaseObject_(obj, callback) { } db.execute(q, null, function(err, result) { if (err) { - callback.call(self, err); + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); + return callback(err); } else { if (key) @@ -2008,7 +2032,10 @@ function saveBaseObject_(obj, callback) { //get updated object self.recast(e.target, target, function(err) { if (err) { - callback.call(self, err); + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); + return callback(err); } else { if (pm.type==='Counter' && typeof db.nextIdentity !== 'function' && e.state===1) { @@ -2022,21 +2049,24 @@ function saveBaseObject_(obj, callback) { if (lastResult) if (lastResult.insertId) e.target[self.primaryKey] = lastResult.insertId; - //raise after save listeners + // raise after save listeners self.emit('after.save',e, function(err) { + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); //invoke callback - callback.call(self, err, e.target); + return callback(err, e.target); }); }); } else { //raise after save listeners self.emit('after.save',e, function(err) { - self.removeListener('after.save', DataObjectAssociationListener.prototype.afterSave); - self.removeListener('after.save', ZeroOrOneMultiplicityListener.prototype.afterSave); - self.removeListener('after.save', DataNestedObjectListener.prototype.afterSave); + afterSaveListeners.forEach(function(listener) { + self.removeListener('after.save', listener); + }); //invoke callback - callback.call(self, err, e.target); + return callback(err, e.target); }); } } diff --git a/package-lock.json b/package-lock.json index f12c74a..89ebe76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@themost/data", - "version": "2.15.0", + "version": "2.15.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@themost/data", - "version": "2.15.0", + "version": "2.15.1", "license": "BSD-3-Clause", "dependencies": { "@themost/events": "^1.0.5", diff --git a/package.json b/package.json index f03dc5f..50ec00c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@themost/data", - "version": "2.15.0", + "version": "2.15.1", "description": "MOST Web Framework Codename Blueshift - Data module", "main": "index.js", "scripts": {