不要怂,就是干,撸起袖子干!

Commit 82719d59 by Sascha Depold

first steps for better private method scoping

1 parent 12fd2280
Showing with 78 additions and 64 deletions
...@@ -115,12 +115,13 @@ ModelFactory.prototype.find = function(options) { ...@@ -115,12 +115,13 @@ ModelFactory.prototype.find = function(options) {
} }
ModelFactory.prototype.build = function(values, options) { ModelFactory.prototype.build = function(values, options) {
var instance = new Model(values, Utils._.extend(this.options, {hasPrimaryKeys: this.hasPrimaryKeys})) var instance = new Model(values, Utils._.extend(this.options, this.attributes, { hasPrimaryKeys: this.hasPrimaryKeys }))
, self = this , self = this
options = options || {} options = options || {}
instance.__definition = this instance.__definition = this
//console.log(this.attributes)
Utils._.map(this.attributes, function(definition, name) { Utils._.map(this.attributes, function(definition, name) {
if(typeof instance[name] == 'undefined') { if(typeof instance[name] == 'undefined') {
var value = null var value = null
...@@ -129,7 +130,7 @@ ModelFactory.prototype.build = function(values, options) { ...@@ -129,7 +130,7 @@ ModelFactory.prototype.build = function(values, options) {
value = self.rawAttributes[name].defaultValue value = self.rawAttributes[name].defaultValue
instance[name] = value instance[name] = value
instance.addAttribute(name, value) instance.__addAttribute(name, value)
} }
}) })
Utils._.each(this.options.instanceMethods || {}, function(fct, name) { instance[name] = fct }) Utils._.each(this.options.instanceMethods || {}, function(fct, name) { instance[name] = fct })
......
var Utils = require("./utils") var Utils = require("./utils")
, Mixin = require("./associations/mixin") , Mixin = require("./associations/mixin")
var Model = module.exports = function(values, options) { module.exports = (function() {
var Model = function(values, options) {
var self = this var self = this
this.__definition = null // will be set in Model.build this.__definition = null // will be set in Model.build
this.attributes = [] this.attributes = []
this.__options = options || {} this.__options = options || {}
// add all passed values to the model and store the attribute names in this.attributes initAttributes.call(this, values)
Utils._.map(values, function(value, key) { self.addAttribute(key, value) })
// set id to null if not passed as value
// a newly created model has no id
var defaults = this.__options.hasPrimaryKeys ? {} : { id: null }
if(this.__options.timestamps) {
defaults[this.__options.underscored ? 'created_at' : 'createdAt'] = new Date()
defaults[this.__options.underscored ? 'updated_at' : 'updatedAt'] = new Date()
if(this.__options.paranoid)
defaults[this.__options.underscored ? 'deleted_at' : 'deletedAt'] = null
} }
Utils.addEventEmitter(Model)
Utils._.extend(Model.prototype, Mixin.prototype)
Utils._.map(defaults, function(value, attr) { Model.Events = {
if(!self.hasOwnProperty(attr))
self.addAttribute(attr, value)
})
}
Utils.addEventEmitter(Model)
Utils._.extend(Model.prototype, Mixin.prototype)
Model.Events = {
insert: 'InsertQuery', insert: 'InsertQuery',
update: 'UpdateQuery', update: 'UpdateQuery',
destroy: 'DestroyQuery' destroy: 'DestroyQuery'
} }
Model.prototype.__defineGetter__('QueryGenerator', function() { Model.prototype.__defineGetter__('QueryGenerator', function() {
return this.__definition.QueryGenerator return this.__definition.QueryGenerator
}) })
Model.prototype.addAttribute = function(attribute, value) {
this[attribute] = value
this.attributes.push(attribute)
}
Model.prototype.query = function() {
var args = Utils._.map(arguments, function(arg, _) { return arg })
, s = this.__definition.modelManager.sequelize
args.push(this)
return s.query.apply(s, args)
}
Model.prototype.save = function() { Model.prototype.save = function() {
var attr = this.__options.underscored ? 'updated_at' : 'updatedAt' var attr = this.__options.underscored ? 'updated_at' : 'updatedAt'
if(this.hasOwnProperty(attr)) if(this.hasOwnProperty(attr))
...@@ -63,7 +33,7 @@ Model.prototype.save = function() { ...@@ -63,7 +33,7 @@ Model.prototype.save = function() {
if(this.isNewRecord) { if(this.isNewRecord) {
var self = this var self = this
var eventEmitter = new Utils.CustomEventEmitter(function() { var eventEmitter = new Utils.CustomEventEmitter(function() {
self.query(self.QueryGenerator.insertQuery(self.__definition.tableName, self.values)) query.call(self, self.QueryGenerator.insertQuery(self.__definition.tableName, self.values))
.on('success', function(obj) { .on('success', function(obj) {
obj.isNewRecord = false obj.isNewRecord = false
eventEmitter.emit('success', obj) eventEmitter.emit('success', obj)
...@@ -73,11 +43,11 @@ Model.prototype.save = function() { ...@@ -73,11 +43,11 @@ Model.prototype.save = function() {
return eventEmitter.run() return eventEmitter.run()
} else { } else {
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id
return this.query(this.QueryGenerator.updateQuery(this.__definition.tableName, this.values, identifier)) return query.call(this, this.QueryGenerator.updateQuery(this.__definition.tableName, this.values, identifier))
}
} }
}
Model.prototype.updateAttributes = function(updates) { Model.prototype.updateAttributes = function(updates) {
var self = this var self = this
var readOnlyAttributes = Utils._.keys(this.__definition.primaryKeys) var readOnlyAttributes = Utils._.keys(this.__definition.primaryKeys)
...@@ -95,19 +65,19 @@ Model.prototype.updateAttributes = function(updates) { ...@@ -95,19 +65,19 @@ Model.prototype.updateAttributes = function(updates) {
updateAllowed && (self[attr] = value) updateAllowed && (self[attr] = value)
}) })
return this.save() return this.save()
} }
Model.prototype.destroy = function() { Model.prototype.destroy = function() {
if(this.__options.timestamps && this.__options.paranoid) { if(this.__options.timestamps && this.__options.paranoid) {
this[this.__options.underscored ? 'deleted_at' : 'deletedAt'] = new Date() this[this.__options.underscored ? 'deleted_at' : 'deletedAt'] = new Date()
return this.save() return this.save()
} else { } else {
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id
return this.query(this.QueryGenerator.deleteQuery(this.__definition.tableName, identifier)) return query.call(this, this.QueryGenerator.deleteQuery(this.__definition.tableName, identifier))
}
} }
}
Model.prototype.__defineGetter__("identifiers", function() { Model.prototype.__defineGetter__("identifiers", function() {
var primaryKeys = Utils._.keys(this.__definition.primaryKeys) var primaryKeys = Utils._.keys(this.__definition.primaryKeys)
, result = {} , result = {}
, self = this , self = this
...@@ -120,16 +90,16 @@ Model.prototype.__defineGetter__("identifiers", function() { ...@@ -120,16 +90,16 @@ Model.prototype.__defineGetter__("identifiers", function() {
}) })
return result return result
}) })
Model.prototype.__defineGetter__('isDeleted', function() { Model.prototype.__defineGetter__('isDeleted', function() {
var result = this.__options.timestamps && this.__options.paranoid var result = this.__options.timestamps && this.__options.paranoid
result = result && this[this.__options.underscored ? 'deleted_at' : 'deletedAt'] != null result = result && this[this.__options.underscored ? 'deleted_at' : 'deletedAt'] != null
return result return result
}) })
Model.prototype.__defineGetter__('values', function() { Model.prototype.__defineGetter__('values', function() {
var result = {} var result = {}
, self = this , self = this
...@@ -138,9 +108,9 @@ Model.prototype.__defineGetter__('values', function() { ...@@ -138,9 +108,9 @@ Model.prototype.__defineGetter__('values', function() {
}) })
return result return result
}) })
Model.prototype.__defineGetter__('primaryKeyValues', function() { Model.prototype.__defineGetter__('primaryKeyValues', function() {
var result = {} var result = {}
, self = this , self = this
...@@ -149,9 +119,9 @@ Model.prototype.__defineGetter__('primaryKeyValues', function() { ...@@ -149,9 +119,9 @@ Model.prototype.__defineGetter__('primaryKeyValues', function() {
}) })
return result return result
}) })
Model.prototype.equals = function(other) { Model.prototype.equals = function(other) {
var result = true var result = true
, self = this , self = this
...@@ -160,16 +130,59 @@ Model.prototype.equals = function(other) { ...@@ -160,16 +130,59 @@ Model.prototype.equals = function(other) {
}) })
return result return result
} }
Model.prototype.equalsOneOf = function(others) { Model.prototype.equalsOneOf = function(others) {
var result = false var result = false
, self = this , self = this
others.forEach(function(other) { result = result || self.equals(other) }) others.forEach(function(other) { result = result || self.equals(other) })
return result return result
} }
// private
var initAttributes = function(values) {
var self = this
// add all passed values to the model and store the attribute names in this.attributes
Utils._.map(values, function(value, key) { self.__addAttribute(key, value) })
// set id to null if not passed as value
// a newly created model has no id
var defaults = this.__options.hasPrimaryKeys ? {} : { id: null }
if(this.__options.timestamps) {
defaults[this.__options.underscored ? 'created_at' : 'createdAt'] = new Date()
defaults[this.__options.underscored ? 'updated_at' : 'updatedAt'] = new Date()
if(this.__options.paranoid)
defaults[this.__options.underscored ? 'deleted_at' : 'deletedAt'] = null
}
Utils._.map(defaults, function(value, attr) {
if(!self.hasOwnProperty(attr))
self.__addAttribute(attr, value)
})
}
var query = function() {
var args = Utils._.map(arguments, function(arg, _) { return arg })
, s = this.__definition.modelManager.sequelize
args.push(this)
return s.query.apply(s, args)
}
Model.prototype.__addAttribute = function(attribute, value) {
this[attribute] = value
this.attributes.push(attribute)
}
/* Add the instance methods to Model */
Utils._.extend(Model.prototype, Mixin.prototype)
/* Add the instance methods to Model */ return Model
Utils._.extend(Model.prototype, Mixin.prototype) })()
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!