diff --git a/dist/lib/Model.js b/dist/lib/Model.js index 8256fa7..1684517 100644 --- a/dist/lib/Model.js +++ b/dist/lib/Model.js @@ -1,3 +1,5 @@ +/// +var MongoDB = require('mongodb'); var Bluebird = require('bluebird'); var _ = require('lodash'); var Core_1 = require('./Core'); @@ -42,6 +44,13 @@ var Model = (function () { this._transforms = instanceType.transforms || {}; this._validators = instanceType.validators || []; this._indexes = instanceType.indexes || []; + if (!this._schema._id) + this._schema._id = MongoDB.ObjectID; + if (this._schema._id === MongoDB.ObjectID && !this._transforms['_id']) + this._transforms['_id'] = { + fromDB: function (value) { return value._bsontype == 'ObjectID' ? new MongoDB.ObjectID(value.id).toHexString() : value; }, + toDB: function (value) { return value && typeof value === 'string' ? new MongoDB.ObjectID(value) : value; } + }; if (instanceType.prototype instanceof Instance_1.default) this._Instance = ModelSpecificInstance_1.default(this, instanceType); else diff --git a/dist/lib/Model.js.map b/dist/lib/Model.js.map index f618f12..e8b54d1 100644 --- a/dist/lib/Model.js.map +++ b/dist/lib/Model.js.map @@ -1 +1 @@ -{"version":3,"sources":["lib/Model.ts"],"names":["Model","Model.constructor","Model.loadExternal","Model.loadInternal","Model.onNewModel","Model.helpers","Model.handlers","Model.hooks","Model.schema","Model.core","Model.collection","Model.collectionName","Model.cacheDirector","Model.cache","Model.Instance","Model.transforms","Model.validators","Model.indexes","Model.find","Model.get","Model.findOne","Model.create","Model.insert","Model.update","Model.count","Model.remove","Model.ensureIndex","Model.ensureIndexes","Model.dropIndex","Model.dropIndexes"],"mappings":"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","file":"lib/Model.js","sourcesContent":["/// \r\nimport MongoDB = require('mongodb');\r\nimport Bluebird = require('bluebird');\r\nimport util = require('util');\r\nimport _ = require('lodash');\r\n\r\nimport Core from './Core';\r\nimport Instance from './Instance';\r\nimport {Schema} from './Schema';\r\nimport {Hooks} from './Hooks';\r\nimport {Plugin} from './Plugins';\r\nimport {Cache} from './Cache';\r\nimport {CacheDirector} from './CacheDirector';\r\nimport * as General from './General';\r\nimport Cursor from './Cursor';\r\nimport * as Index from './Index';\r\nimport * as ModelOptions from './ModelOptions';\r\n\r\nimport noOpCache from './caches/NoOpCache';\r\nimport memoryCache from './caches/MemoryCache';\r\nimport idCacheController from './cacheControllers/IDDirector';\r\n\r\nimport Omnom from './utils/Omnom';\r\nimport ModelCache from './ModelCache';\r\nimport ModelHelpers from './ModelHelpers';\r\nimport ModelHandlers from './ModelHandlers';\r\nimport * as ModelInterfaces from './ModelInterfaces';\r\nimport ModelSpecificInstance from './ModelSpecificInstance';\r\nimport InstanceImplementation from './InstanceInterface';\r\n\r\n/**\r\n * An Iridium Model which represents a structured MongoDB collection\r\n * @class\r\n */\r\nexport default class Model {\r\n /**\r\n * Creates a new Iridium model representing a given ISchema and backed by a collection whose name is specified\r\n * @param {Iridium} core The Iridium core that this model should use for database access\r\n * @param {ModelInterfaces.InstanceImplementation} instanceType The class which will be instantiated for each document retrieved from the database\r\n * @returns {Model}\r\n * @constructor\r\n */\r\n constructor(core: Core, instanceType: InstanceImplementation) {\r\n if (!(core instanceof Core)) throw new Error(\"You failed to provide a valid Iridium core for this model\");\r\n if (typeof instanceType != 'function') throw new Error(\"You failed to provide a valid instance constructor for this model\");\r\n if (typeof instanceType.collection != 'string' || !instanceType.collection) throw new Error(\"You failed to provide a valid collection name for this model\");\r\n if (!_.isPlainObject(instanceType.schema) || instanceType.schema._id === undefined) throw new Error(\"You failed to provide a valid schema for this model\");\r\n \r\n this._core = core;\r\n \r\n this.loadExternal(instanceType);\r\n this.onNewModel();\r\n this.loadInternal();\r\n }\r\n \r\n private loadExternal(instanceType: InstanceImplementation) {\r\n this._collection = instanceType.collection;\r\n this._schema = instanceType.schema;\r\n this._hooks = instanceType;\r\n this._cacheDirector = instanceType.cache;\r\n this._transforms = instanceType.transforms || {};\r\n this._validators = instanceType.validators || [];\r\n this._indexes = instanceType.indexes || [];\r\n\r\n if ((instanceType).prototype instanceof Instance)\r\n this._Instance = ModelSpecificInstance(this, instanceType);\r\n else\r\n this._Instance = instanceType.bind(undefined, this);\r\n }\r\n \r\n private loadInternal() {\r\n this._cache = new ModelCache(this);\r\n this._helpers = new ModelHelpers(this);\r\n this._handlers = new ModelHandlers(this);\r\n }\r\n \r\n private onNewModel() {\r\n this._core.plugins.forEach(plugin => plugin.newModel && plugin.newModel(this));\r\n }\r\n\r\n private _helpers: ModelHelpers;\r\n /**\r\n * Provides helper methods used by Iridium for common tasks\r\n * @returns {ModelHelpers}\r\n */\r\n get helpers(): ModelHelpers {\r\n return this._helpers;\r\n }\r\n\r\n private _handlers: ModelHandlers;\r\n /**\r\n * Provides helper methods used by Iridium for hook delegation and common processes\r\n * @returns {ModelHandlers}\r\n */\r\n get handlers(): ModelHandlers {\r\n return this._handlers;\r\n }\r\n \r\n private _hooks: Hooks = {};\r\n \r\n /**\r\n * Gets the even hooks subscribed on this model for a number of different state changes\r\n * @returns {Hooks}\r\n */\r\n get hooks(): Hooks {\r\n return this._hooks;\r\n }\r\n\r\n private _schema: Schema;\r\n /**\r\n * Gets the ISchema dictating the data structure represented by this model\r\n * @public\r\n * @returns {schema}\r\n */\r\n get schema(): Schema {\r\n return this._schema;\r\n }\r\n\r\n private _core: Core;\r\n /**\r\n * Gets the Iridium core that this model is associated with\r\n * @public\r\n * @returns {Iridium}\r\n */\r\n get core(): Core {\r\n return this._core;\r\n }\r\n\r\n private _collection: string;\r\n /**\r\n * Gets the underlying MongoDB collection from which this model's documents are retrieved\r\n * @public\r\n * @returns {Collection}\r\n */\r\n get collection(): MongoDB.Collection {\r\n if (!this.core.connection) throw new Error(\"Iridium Core not connected to a database.\");\r\n return this.core.connection.collection(this._collection);\r\n }\r\n \r\n /**\r\n * Gets the name of the underlying MongoDB collection from which this model's documents are retrieved\r\n * @public\r\n */\r\n get collectionName(): string {\r\n return this._collection;\r\n }\r\n\r\n /**\r\n * Sets the name of the underlying MongoDB collection from which this model's documents are retrieved\r\n * @public\r\n */\r\n set collectionName(value: string) {\r\n this._collection = value;\r\n }\r\n\r\n private _cacheDirector: CacheDirector;\r\n /**\r\n * Gets the cache controller which dictates which queries will be cached, and under which key\r\n * @public\r\n * @returns {CacheDirector}\r\n */\r\n get cacheDirector(): CacheDirector {\r\n return this._cacheDirector;\r\n }\r\n\r\n private _cache: ModelCache;\r\n /**\r\n * Gets the cache responsible for storing objects for quick retrieval under certain conditions\r\n * @public\r\n * @returns {ModelCache}\r\n */\r\n get cache(): ModelCache {\r\n return this._cache;\r\n }\r\n\r\n private _Instance: ModelInterfaces.ModelSpecificInstanceConstructor;\r\n\r\n /**\r\n * Gets the constructor responsible for creating instances for this model\r\n */\r\n get Instance(): ModelInterfaces.ModelSpecificInstanceConstructor {\r\n return this._Instance;\r\n }\r\n \r\n private _transforms: { [property: string]: { fromDB: (value: any) => any; toDB: (value: any) => any; } };\r\n \r\n get transforms() {\r\n return this._transforms;\r\n }\r\n \r\n private _validators: Skmatc.Validator[];\r\n \r\n get validators() {\r\n return this._validators;\r\n }\r\n \r\n private _indexes: (Index.Index | Index.IndexSpecification)[];\r\n \r\n get indexes() {\r\n return this._indexes;\r\n }\r\n \r\n /**\r\n * Retrieves all documents in the collection and wraps them as instances\r\n * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available\r\n * @returns {Promise}\r\n */\r\n find(): Cursor;\r\n /**\r\n * Returns all documents in the collection which match the conditions and wraps them as instances\r\n * @param {Object} conditions The MongoDB query dictating which documents to return\r\n * @returns {Promise}\r\n */\r\n find(conditions: { _id?: any, [key: string]: any } | any): Cursor;\r\n /**\r\n * Returns all documents in the collection which match the conditions\r\n * @param {Object} conditions The MongoDB query dictating which documents to return\r\n * @param {Object} fields The fields to include or exclude from the document\r\n * @returns {Promise}\r\n */\r\n find(conditions: { _id?: any, [key: string]: any } | any, fields: { [name: string]: number }): Cursor;\r\n find(conditions?: { _id?: any, [key: string]: any } | any, fields?: any): Cursor {\r\n conditions = conditions || {};\r\n fields = fields || {};\r\n\r\n if (!_.isPlainObject(conditions)) conditions = { _id: conditions };\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n var cursor = this.collection.find(conditions, {\r\n fields: fields\r\n });\r\n\r\n return new Cursor(this, conditions, cursor);\r\n }\r\n\r\n /**\r\n * Retrieves a single document from the collection and wraps it as an instance\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(id: any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(conditions: { _id?: any, [key: string]: any }, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(id: any, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(conditions: { _id?: any, [key: string]: any }, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n get(...args: any[]): Bluebird {\r\n return this.findOne.apply(this, args);\r\n }\r\n\r\n /**\r\n * Retrieves a single document from the collection and wraps it as an instance\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(id: any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(conditions: { _id?: any, [key: string]: any }, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(id: any, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(conditions: { _id?: any, [key: string]: any }, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n findOne(...args: any[]): Bluebird {\r\n var conditions: { _id?: any, [key: string]: any } = null;\r\n var options: ModelOptions.QueryOptions = null;\r\n var callback: General.Callback = null;\r\n\r\n for (var argI = 0; argI < args.length; argI++) {\r\n if (typeof args[argI] == 'function') callback = callback || args[argI];\r\n else if (_.isPlainObject(args[argI])) {\r\n if (conditions) options = args[argI];\r\n else conditions = args[argI];\r\n }\r\n else conditions = { _id: args[argI] };\r\n }\r\n\r\n conditions = conditions || {};\r\n options = options || {};\r\n\r\n _.defaults(options, {\r\n cache: true\r\n });\r\n\r\n return Bluebird.resolve().bind(this).then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return this._cache.get(conditions);\r\n }).then((cachedDocument: TDocument) => {\r\n if (cachedDocument) return cachedDocument;\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.findOne(conditions, {\r\n fields: options.fields,\r\n skip: options.skip,\r\n sort: options.sort,\r\n limit: options.limit\r\n },(err, result) => {\r\n if (err) return reject(err);\r\n return resolve(result);\r\n });\r\n });\r\n }).then((document: TDocument) => {\r\n if (!document) return null;\r\n return this._handlers.documentReceived(conditions, document,(document, isNew?, isPartial?) => this._helpers.wrapDocument(document, isNew, isPartial), options);\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument, options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument[], callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument[], options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n create(...args: any[]): Bluebird {\r\n return this.insert.apply(this, args);\r\n }\r\n\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument, options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {function(Error, TInstance[])} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument[], callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance[])} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument[], options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n insert(objs: TDocument | TDocument[], ...args: any[]): Bluebird {\r\n var objects: TDocument[];\r\n var options: ModelOptions.CreateOptions = {};\r\n var callback: General.Callback = null;\r\n if (typeof args[0] == 'function') callback = args[0];\r\n else {\r\n options = args[0];\r\n callback = args[1];\r\n }\r\n\r\n if (Array.isArray(objs))\r\n objects = objs;\r\n else\r\n objects = [objs];\r\n\r\n options = options || {};\r\n _.defaults(options, {\r\n w: 'majority',\r\n forceServerObjectId: true\r\n });\r\n\r\n return Bluebird.resolve().then(() => {\r\n var queryOptions = { w: options.w, upsert: options.upsert, new: true };\r\n\r\n if (options.upsert) {\r\n var docs = this._handlers.creatingDocuments(objects);\r\n return docs.map((object: { _id: any; }) => {\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.findAndModify({ _id: object._id }, [\"_id\"], object, queryOptions,(err, result) => {\r\n if (err) return reject(err);\r\n return resolve(result);\r\n });\r\n });\r\n });\r\n }\r\n else\r\n return this._handlers.creatingDocuments(objects).then(objects => _.chunk(objects, 1000)).map((objects: any[]) => {\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.insertMany(objects, queryOptions,(err, result) => {\r\n if (err) return reject(err);\r\n return resolve(result.ops);\r\n });\r\n });\r\n }).then(results => _.flatten(results));\r\n }).map((inserted: any) => {\r\n return this._handlers.documentReceived(null, inserted,(document, isNew?, isPartial?) => this._helpers.wrapDocument(document, isNew, isPartial), { cache: options.cache });\r\n }).then((results: TInstance[]) => {\r\n if (Array.isArray(objs)) return results;\r\n return results[0];\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Updates the documents in the backing collection which match the conditions using the given update instructions\r\n * @param {Object} conditions The conditions which determine which documents will be updated\r\n * @param {Object} changes The changes to make to the documents\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n */\r\n update(conditions: { _id?: any, [key: string]: any } | any, changes: any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Updates the documents in the backing collection which match the conditions using the given update instructions\r\n * @param {Object} conditions The conditions which determine which documents will be updated\r\n * @param {Object} changes The changes to make to the documents\r\n * @param {UpdateOptions} options The options which dictate how this function behaves\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n */\r\n update(conditions: { _id?: any, [key: string]: any } | any, changes: any, options: ModelOptions.UpdateOptions, callback?: General.Callback): Bluebird;\r\n update(conditions: { _id?: any, [key: string]: any } | any, changes: any, options?: ModelOptions.UpdateOptions, callback?: General.Callback): Bluebird {\r\n if (typeof options == 'function') {\r\n callback = >options;\r\n options = {};\r\n }\r\n \r\n options = options || {};\r\n\r\n if (!_.isPlainObject(conditions)) conditions = {\r\n _id: conditions\r\n };\r\n\r\n _.defaults(options, {\r\n w: 'majority',\r\n multi: true\r\n });\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.updateMany(conditions, changes, options,(err, response) => {\r\n if (err) return reject(err);\r\n\r\n // New MongoDB 2.6+ response type\r\n if (response.result && response.result.nModified !== undefined) return resolve(response.result.nModified);\r\n\r\n // Legacy response type\r\n return resolve(response.result.n);\r\n });\r\n })\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Counts the number of documents in the collection\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n count(callback?: General.Callback): Bluebird;\r\n /**\r\n * Counts the number of documents in the collection which match the conditions provided\r\n * @param {Object} conditions The conditions which determine whether an object is counted or not\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n count(conditions: { _id?: any, [key: string]: any } | any, callback?: General.Callback): Bluebird;\r\n count(conds?: any, callback?: General.Callback): Bluebird {\r\n var conditions: { _id?: any, [key: string]: any } = <{ _id?: any, [key: string]: any }>conds;\r\n if (typeof conds == 'function') {\r\n callback = >conds;\r\n conditions = {};\r\n }\r\n\r\n conditions = conditions || {};\r\n\r\n if (!_.isPlainObject(conditions)) conditions = {\r\n _id: conditions\r\n };\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.count(conditions,(err, results) => {\r\n if (err) return reject(err);\r\n return resolve(results);\r\n });\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Removes all documents from the collection\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n remove(callback?: General.Callback): Bluebird;\r\n /**\r\n * Removes all documents from the collection which match the conditions\r\n * @param {Object} conditions The conditions determining whether an object is removed or not\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n remove(conditions: { _id?: any, [key: string]: any } | any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Removes all documents from the collection which match the conditions\r\n * @param {Object} conditions The conditions determining whether an object is removed or not\r\n * @param {Object} options The options controlling the way in which the function behaves\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n remove(conditions: { _id?: any, [key: string]: any }, options: ModelOptions.RemoveOptions, callback?: General.Callback): Bluebird;\r\n remove(conds?: any, options?: ModelOptions.RemoveOptions, callback?: General.Callback): Bluebird {\r\n var conditions: { _id?: any, [key: string]: any } = <{ _id?: any, [key: string]: any }>conds;\r\n \r\n if (typeof options === 'function') {\r\n callback = >options;\r\n options = {};\r\n }\r\n \r\n if (typeof conds == 'function') {\r\n callback = >conds;\r\n options = {};\r\n conditions = {};\r\n }\r\n\r\n conditions = conditions || {};\r\n options = options || {};\r\n \r\n _.defaults(options, {\r\n w: 'majority'\r\n });\r\n\r\n if (!_.isPlainObject(conditions)) conditions = {\r\n _id: conditions\r\n };\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.remove(conditions, options,(err, response) => {\r\n if (err) return reject(err);\r\n return resolve(response.result.n);\r\n });\r\n });\r\n }).then((count) => {\r\n if (count === 1) this._cache.clear(conditions);\r\n return Bluebird.resolve(count);\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Ensures that the given index is created for the collection\r\n * @param {Object} specification The index specification object used by MongoDB\r\n * @param {function(Error, String)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} The name of the index\r\n */\r\n ensureIndex(specification: Index.IndexSpecification, callback?: General.Callback): Bluebird;\r\n /**\r\n * Ensures that the given index is created for the collection\r\n * @param {Object} specification The index specification object used by MongoDB\r\n * @param {MongoDB.IndexOptions} options The options dictating how the index is created and behaves\r\n * @param {function(Error, String)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} The name of the index\r\n */\r\n ensureIndex(specification: Index.IndexSpecification, options: MongoDB.IndexOptions, callback?: General.Callback): Bluebird;\r\n ensureIndex(specification: Index.IndexSpecification, options?: MongoDB.IndexOptions, callback?: General.Callback): Bluebird {\r\n if (typeof options == 'function') {\r\n callback = >options;\r\n options = {};\r\n }\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.ensureIndex(specification, options,(err, name: any) => {\r\n if (err) return reject(err);\r\n return resolve(name);\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Ensures that all indexes defined in the model's options are created\r\n * @param {function(Error, String[])} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} The names of the indexes\r\n */\r\n ensureIndexes(callback?: General.Callback): Bluebird {\r\n return Bluebird.resolve(this._indexes).map((index: Index.Index | Index.IndexSpecification) => {\r\n return this.ensureIndex((index).spec || index,(index).options || {});\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Drops the index with the specified name if it exists in the collection\r\n * @param {String} name The name of the index to remove\r\n * @param {function(Error, Boolean)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} Whether the index was dropped\r\n */\r\n dropIndex(name: string, callback?: General.Callback): Bluebird;\r\n /**\r\n * Drops the index if it exists in the collection\r\n * @param {IndexSpecification} index The index to remove\r\n * @param {function(Error, Boolean)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} Whether the index was dropped\r\n */\r\n dropIndex(index: Index.IndexSpecification, callback?: General.Callback): Bluebird;\r\n dropIndex(specification: string | Index.IndexSpecification, callback?: General.Callback): Bluebird {\r\n var index: string;\r\n\r\n if (typeof (specification) === 'string') index = specification;\r\n else {\r\n index = _(specification).map((direction, key) => key + '_' + direction).reduce((x, y) => x + '_' + y);\r\n }\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.dropIndex(index,(err, result: { ok: number }) => {\r\n if (err) return reject(err);\r\n return resolve(!!result.ok);\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Removes all indexes (except for _id) from the collection\r\n * @param {function(Error, Boolean)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} Whether the indexes were dropped\r\n */\r\n dropIndexes(callback?: General.Callback): Bluebird {\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.dropAllIndexes((err, count) => {\r\n if (err) return reject(err);\r\n return resolve(count);\r\n });\r\n }).nodeify(callback);\r\n }\r\n}\r\n"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["lib/Model.ts"],"names":["Model","Model.constructor","Model.loadExternal","Model.loadInternal","Model.onNewModel","Model.helpers","Model.handlers","Model.hooks","Model.schema","Model.core","Model.collection","Model.collectionName","Model.cacheDirector","Model.cache","Model.Instance","Model.transforms","Model.validators","Model.indexes","Model.find","Model.get","Model.findOne","Model.create","Model.insert","Model.update","Model.count","Model.remove","Model.ensureIndex","Model.ensureIndexes","Model.dropIndex","Model.dropIndexes"],"mappings":"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","file":"lib/Model.js","sourcesContent":["/// \r\nimport MongoDB = require('mongodb');\r\nimport Bluebird = require('bluebird');\r\nimport util = require('util');\r\nimport _ = require('lodash');\r\n\r\nimport Core from './Core';\r\nimport Instance from './Instance';\r\nimport {Schema} from './Schema';\r\nimport {Hooks} from './Hooks';\r\nimport {Plugin} from './Plugins';\r\nimport {Cache} from './Cache';\r\nimport {CacheDirector} from './CacheDirector';\r\nimport * as General from './General';\r\nimport Cursor from './Cursor';\r\nimport * as Index from './Index';\r\nimport * as ModelOptions from './ModelOptions';\r\n\r\nimport noOpCache from './caches/NoOpCache';\r\nimport memoryCache from './caches/MemoryCache';\r\nimport idCacheController from './cacheControllers/IDDirector';\r\n\r\nimport Omnom from './utils/Omnom';\r\nimport ModelCache from './ModelCache';\r\nimport ModelHelpers from './ModelHelpers';\r\nimport ModelHandlers from './ModelHandlers';\r\nimport * as ModelInterfaces from './ModelInterfaces';\r\nimport ModelSpecificInstance from './ModelSpecificInstance';\r\nimport InstanceImplementation from './InstanceInterface';\r\n\r\n/**\r\n * An Iridium Model which represents a structured MongoDB collection\r\n * @class\r\n */\r\nexport default class Model {\r\n /**\r\n * Creates a new Iridium model representing a given ISchema and backed by a collection whose name is specified\r\n * @param {Iridium} core The Iridium core that this model should use for database access\r\n * @param {ModelInterfaces.InstanceImplementation} instanceType The class which will be instantiated for each document retrieved from the database\r\n * @returns {Model}\r\n * @constructor\r\n */\r\n constructor(core: Core, instanceType: InstanceImplementation) {\r\n if (!(core instanceof Core)) throw new Error(\"You failed to provide a valid Iridium core for this model\");\r\n if (typeof instanceType != 'function') throw new Error(\"You failed to provide a valid instance constructor for this model\");\r\n if (typeof instanceType.collection != 'string' || !instanceType.collection) throw new Error(\"You failed to provide a valid collection name for this model\");\r\n if (!_.isPlainObject(instanceType.schema) || instanceType.schema._id === undefined) throw new Error(\"You failed to provide a valid schema for this model\");\r\n \r\n this._core = core;\r\n \r\n this.loadExternal(instanceType);\r\n this.onNewModel();\r\n this.loadInternal();\r\n }\r\n \r\n private loadExternal(instanceType: InstanceImplementation) {\r\n this._collection = instanceType.collection;\r\n this._schema = instanceType.schema;\r\n this._hooks = instanceType;\r\n this._cacheDirector = instanceType.cache;\r\n this._transforms = instanceType.transforms || {};\r\n this._validators = instanceType.validators || [];\r\n this._indexes = instanceType.indexes || [];\r\n \r\n if(!this._schema._id) this._schema._id = MongoDB.ObjectID;\r\n \r\n if(this._schema._id === MongoDB.ObjectID && !this._transforms['_id'])\r\n this._transforms['_id'] = {\r\n fromDB: value => value._bsontype == 'ObjectID' ? new MongoDB.ObjectID(value.id).toHexString() : value,\r\n toDB: value => value && typeof value === 'string' ? new MongoDB.ObjectID(value) : value\r\n };\r\n\r\n if ((instanceType).prototype instanceof Instance)\r\n this._Instance = ModelSpecificInstance(this, instanceType);\r\n else\r\n this._Instance = instanceType.bind(undefined, this);\r\n }\r\n \r\n private loadInternal() {\r\n this._cache = new ModelCache(this);\r\n this._helpers = new ModelHelpers(this);\r\n this._handlers = new ModelHandlers(this);\r\n }\r\n \r\n private onNewModel() {\r\n this._core.plugins.forEach(plugin => plugin.newModel && plugin.newModel(this));\r\n }\r\n\r\n private _helpers: ModelHelpers;\r\n /**\r\n * Provides helper methods used by Iridium for common tasks\r\n * @returns {ModelHelpers}\r\n */\r\n get helpers(): ModelHelpers {\r\n return this._helpers;\r\n }\r\n\r\n private _handlers: ModelHandlers;\r\n /**\r\n * Provides helper methods used by Iridium for hook delegation and common processes\r\n * @returns {ModelHandlers}\r\n */\r\n get handlers(): ModelHandlers {\r\n return this._handlers;\r\n }\r\n \r\n private _hooks: Hooks = {};\r\n \r\n /**\r\n * Gets the even hooks subscribed on this model for a number of different state changes\r\n * @returns {Hooks}\r\n */\r\n get hooks(): Hooks {\r\n return this._hooks;\r\n }\r\n\r\n private _schema: Schema;\r\n /**\r\n * Gets the ISchema dictating the data structure represented by this model\r\n * @public\r\n * @returns {schema}\r\n */\r\n get schema(): Schema {\r\n return this._schema;\r\n }\r\n\r\n private _core: Core;\r\n /**\r\n * Gets the Iridium core that this model is associated with\r\n * @public\r\n * @returns {Iridium}\r\n */\r\n get core(): Core {\r\n return this._core;\r\n }\r\n\r\n private _collection: string;\r\n /**\r\n * Gets the underlying MongoDB collection from which this model's documents are retrieved\r\n * @public\r\n * @returns {Collection}\r\n */\r\n get collection(): MongoDB.Collection {\r\n if (!this.core.connection) throw new Error(\"Iridium Core not connected to a database.\");\r\n return this.core.connection.collection(this._collection);\r\n }\r\n \r\n /**\r\n * Gets the name of the underlying MongoDB collection from which this model's documents are retrieved\r\n * @public\r\n */\r\n get collectionName(): string {\r\n return this._collection;\r\n }\r\n\r\n /**\r\n * Sets the name of the underlying MongoDB collection from which this model's documents are retrieved\r\n * @public\r\n */\r\n set collectionName(value: string) {\r\n this._collection = value;\r\n }\r\n\r\n private _cacheDirector: CacheDirector;\r\n /**\r\n * Gets the cache controller which dictates which queries will be cached, and under which key\r\n * @public\r\n * @returns {CacheDirector}\r\n */\r\n get cacheDirector(): CacheDirector {\r\n return this._cacheDirector;\r\n }\r\n\r\n private _cache: ModelCache;\r\n /**\r\n * Gets the cache responsible for storing objects for quick retrieval under certain conditions\r\n * @public\r\n * @returns {ModelCache}\r\n */\r\n get cache(): ModelCache {\r\n return this._cache;\r\n }\r\n\r\n private _Instance: ModelInterfaces.ModelSpecificInstanceConstructor;\r\n\r\n /**\r\n * Gets the constructor responsible for creating instances for this model\r\n */\r\n get Instance(): ModelInterfaces.ModelSpecificInstanceConstructor {\r\n return this._Instance;\r\n }\r\n \r\n private _transforms: { [property: string]: { fromDB: (value: any) => any; toDB: (value: any) => any; } };\r\n \r\n get transforms() {\r\n return this._transforms;\r\n }\r\n \r\n private _validators: Skmatc.Validator[];\r\n \r\n get validators() {\r\n return this._validators;\r\n }\r\n \r\n private _indexes: (Index.Index | Index.IndexSpecification)[];\r\n \r\n get indexes() {\r\n return this._indexes;\r\n }\r\n \r\n /**\r\n * Retrieves all documents in the collection and wraps them as instances\r\n * @param {function(Error, TInstance[])} callback An optional callback which will be triggered when results are available\r\n * @returns {Promise}\r\n */\r\n find(): Cursor;\r\n /**\r\n * Returns all documents in the collection which match the conditions and wraps them as instances\r\n * @param {Object} conditions The MongoDB query dictating which documents to return\r\n * @returns {Promise}\r\n */\r\n find(conditions: { _id?: any, [key: string]: any } | any): Cursor;\r\n /**\r\n * Returns all documents in the collection which match the conditions\r\n * @param {Object} conditions The MongoDB query dictating which documents to return\r\n * @param {Object} fields The fields to include or exclude from the document\r\n * @returns {Promise}\r\n */\r\n find(conditions: { _id?: any, [key: string]: any } | any, fields: { [name: string]: number }): Cursor;\r\n find(conditions?: { _id?: any, [key: string]: any } | any, fields?: any): Cursor {\r\n conditions = conditions || {};\r\n fields = fields || {};\r\n\r\n if (!_.isPlainObject(conditions)) conditions = { _id: conditions };\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n var cursor = this.collection.find(conditions, {\r\n fields: fields\r\n });\r\n\r\n return new Cursor(this, conditions, cursor);\r\n }\r\n\r\n /**\r\n * Retrieves a single document from the collection and wraps it as an instance\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(id: any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(conditions: { _id?: any, [key: string]: any }, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(id: any, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n get(conditions: { _id?: any, [key: string]: any }, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n get(...args: any[]): Bluebird {\r\n return this.findOne.apply(this, args);\r\n }\r\n\r\n /**\r\n * Retrieves a single document from the collection and wraps it as an instance\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(id: any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(conditions: { _id?: any, [key: string]: any }, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection with the given ID and wraps it as an instance\r\n * @param {any} id The document's unique _id field value in downstream format\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(id: any, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Retrieves a single document from the collection which matches the conditions\r\n * @param {Object} conditions The MongoDB query dictating which document to return\r\n * @param {QueryOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback An optional callback which will be triggered when a result is available\r\n * @returns {Promise}\r\n */\r\n findOne(conditions: { _id?: any, [key: string]: any }, options: ModelOptions.QueryOptions, callback?: General.Callback): Bluebird;\r\n findOne(...args: any[]): Bluebird {\r\n var conditions: { _id?: any, [key: string]: any } = null;\r\n var options: ModelOptions.QueryOptions = null;\r\n var callback: General.Callback = null;\r\n\r\n for (var argI = 0; argI < args.length; argI++) {\r\n if (typeof args[argI] == 'function') callback = callback || args[argI];\r\n else if (_.isPlainObject(args[argI])) {\r\n if (conditions) options = args[argI];\r\n else conditions = args[argI];\r\n }\r\n else conditions = { _id: args[argI] };\r\n }\r\n\r\n conditions = conditions || {};\r\n options = options || {};\r\n\r\n _.defaults(options, {\r\n cache: true\r\n });\r\n\r\n return Bluebird.resolve().bind(this).then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return this._cache.get(conditions);\r\n }).then((cachedDocument: TDocument) => {\r\n if (cachedDocument) return cachedDocument;\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.findOne(conditions, {\r\n fields: options.fields,\r\n skip: options.skip,\r\n sort: options.sort,\r\n limit: options.limit\r\n },(err, result) => {\r\n if (err) return reject(err);\r\n return resolve(result);\r\n });\r\n });\r\n }).then((document: TDocument) => {\r\n if (!document) return null;\r\n return this._handlers.documentReceived(conditions, document,(document, isNew?, isPartial?) => this._helpers.wrapDocument(document, isNew, isPartial), options);\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument, options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument[], callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n create(objects: TDocument[], options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n create(...args: any[]): Bluebird {\r\n return this.insert.apply(this, args);\r\n }\r\n\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts an object into the collection after validating it against this model's schema\r\n * @param {Object} object The object to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument, options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {function(Error, TInstance[])} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument[], callback?: General.Callback): Bluebird;\r\n /**\r\n * Inserts the objects into the collection after validating them against this model's schema\r\n * @param {Object[]} objects The objects to insert into the collection\r\n * @param {CreateOptions} options The options dictating how this function behaves\r\n * @param {function(Error, TInstance[])} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n insert(objects: TDocument[], options: ModelOptions.CreateOptions, callback?: General.Callback): Bluebird;\r\n insert(objs: TDocument | TDocument[], ...args: any[]): Bluebird {\r\n var objects: TDocument[];\r\n var options: ModelOptions.CreateOptions = {};\r\n var callback: General.Callback = null;\r\n if (typeof args[0] == 'function') callback = args[0];\r\n else {\r\n options = args[0];\r\n callback = args[1];\r\n }\r\n\r\n if (Array.isArray(objs))\r\n objects = objs;\r\n else\r\n objects = [objs];\r\n\r\n options = options || {};\r\n _.defaults(options, {\r\n w: 'majority',\r\n forceServerObjectId: true\r\n });\r\n\r\n return Bluebird.resolve().then(() => {\r\n var queryOptions = { w: options.w, upsert: options.upsert, new: true };\r\n\r\n if (options.upsert) {\r\n var docs = this._handlers.creatingDocuments(objects);\r\n return docs.map((object: { _id: any; }) => {\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.findAndModify({ _id: object._id }, [\"_id\"], object, queryOptions,(err, result) => {\r\n if (err) return reject(err);\r\n return resolve(result);\r\n });\r\n });\r\n });\r\n }\r\n else\r\n return this._handlers.creatingDocuments(objects).then(objects => _.chunk(objects, 1000)).map((objects: any[]) => {\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.insertMany(objects, queryOptions,(err, result) => {\r\n if (err) return reject(err);\r\n return resolve(result.ops);\r\n });\r\n });\r\n }).then(results => _.flatten(results));\r\n }).map((inserted: any) => {\r\n return this._handlers.documentReceived(null, inserted,(document, isNew?, isPartial?) => this._helpers.wrapDocument(document, isNew, isPartial), { cache: options.cache });\r\n }).then((results: TInstance[]) => {\r\n if (Array.isArray(objs)) return results;\r\n return results[0];\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Updates the documents in the backing collection which match the conditions using the given update instructions\r\n * @param {Object} conditions The conditions which determine which documents will be updated\r\n * @param {Object} changes The changes to make to the documents\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n */\r\n update(conditions: { _id?: any, [key: string]: any } | any, changes: any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Updates the documents in the backing collection which match the conditions using the given update instructions\r\n * @param {Object} conditions The conditions which determine which documents will be updated\r\n * @param {Object} changes The changes to make to the documents\r\n * @param {UpdateOptions} options The options which dictate how this function behaves\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n */\r\n update(conditions: { _id?: any, [key: string]: any } | any, changes: any, options: ModelOptions.UpdateOptions, callback?: General.Callback): Bluebird;\r\n update(conditions: { _id?: any, [key: string]: any } | any, changes: any, options?: ModelOptions.UpdateOptions, callback?: General.Callback): Bluebird {\r\n if (typeof options == 'function') {\r\n callback = >options;\r\n options = {};\r\n }\r\n \r\n options = options || {};\r\n\r\n if (!_.isPlainObject(conditions)) conditions = {\r\n _id: conditions\r\n };\r\n\r\n _.defaults(options, {\r\n w: 'majority',\r\n multi: true\r\n });\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.updateMany(conditions, changes, options,(err, response) => {\r\n if (err) return reject(err);\r\n\r\n // New MongoDB 2.6+ response type\r\n if (response.result && response.result.nModified !== undefined) return resolve(response.result.nModified);\r\n\r\n // Legacy response type\r\n return resolve(response.result.n);\r\n });\r\n })\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Counts the number of documents in the collection\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n count(callback?: General.Callback): Bluebird;\r\n /**\r\n * Counts the number of documents in the collection which match the conditions provided\r\n * @param {Object} conditions The conditions which determine whether an object is counted or not\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n count(conditions: { _id?: any, [key: string]: any } | any, callback?: General.Callback): Bluebird;\r\n count(conds?: any, callback?: General.Callback): Bluebird {\r\n var conditions: { _id?: any, [key: string]: any } = <{ _id?: any, [key: string]: any }>conds;\r\n if (typeof conds == 'function') {\r\n callback = >conds;\r\n conditions = {};\r\n }\r\n\r\n conditions = conditions || {};\r\n\r\n if (!_.isPlainObject(conditions)) conditions = {\r\n _id: conditions\r\n };\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.count(conditions,(err, results) => {\r\n if (err) return reject(err);\r\n return resolve(results);\r\n });\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Removes all documents from the collection\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n remove(callback?: General.Callback): Bluebird;\r\n /**\r\n * Removes all documents from the collection which match the conditions\r\n * @param {Object} conditions The conditions determining whether an object is removed or not\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n remove(conditions: { _id?: any, [key: string]: any } | any, callback?: General.Callback): Bluebird;\r\n /**\r\n * Removes all documents from the collection which match the conditions\r\n * @param {Object} conditions The conditions determining whether an object is removed or not\r\n * @param {Object} options The options controlling the way in which the function behaves\r\n * @param {function(Error, Number)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise}\r\n */\r\n remove(conditions: { _id?: any, [key: string]: any }, options: ModelOptions.RemoveOptions, callback?: General.Callback): Bluebird;\r\n remove(conds?: any, options?: ModelOptions.RemoveOptions, callback?: General.Callback): Bluebird {\r\n var conditions: { _id?: any, [key: string]: any } = <{ _id?: any, [key: string]: any }>conds;\r\n \r\n if (typeof options === 'function') {\r\n callback = >options;\r\n options = {};\r\n }\r\n \r\n if (typeof conds == 'function') {\r\n callback = >conds;\r\n options = {};\r\n conditions = {};\r\n }\r\n\r\n conditions = conditions || {};\r\n options = options || {};\r\n \r\n _.defaults(options, {\r\n w: 'majority'\r\n });\r\n\r\n if (!_.isPlainObject(conditions)) conditions = {\r\n _id: conditions\r\n };\r\n\r\n return Bluebird.resolve().then(() => {\r\n conditions = this._helpers.convertToDB(conditions);\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.remove(conditions, options,(err, response) => {\r\n if (err) return reject(err);\r\n return resolve(response.result.n);\r\n });\r\n });\r\n }).then((count) => {\r\n if (count === 1) this._cache.clear(conditions);\r\n return Bluebird.resolve(count);\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Ensures that the given index is created for the collection\r\n * @param {Object} specification The index specification object used by MongoDB\r\n * @param {function(Error, String)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} The name of the index\r\n */\r\n ensureIndex(specification: Index.IndexSpecification, callback?: General.Callback): Bluebird;\r\n /**\r\n * Ensures that the given index is created for the collection\r\n * @param {Object} specification The index specification object used by MongoDB\r\n * @param {MongoDB.IndexOptions} options The options dictating how the index is created and behaves\r\n * @param {function(Error, String)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} The name of the index\r\n */\r\n ensureIndex(specification: Index.IndexSpecification, options: MongoDB.IndexOptions, callback?: General.Callback): Bluebird;\r\n ensureIndex(specification: Index.IndexSpecification, options?: MongoDB.IndexOptions, callback?: General.Callback): Bluebird {\r\n if (typeof options == 'function') {\r\n callback = >options;\r\n options = {};\r\n }\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.ensureIndex(specification, options,(err, name: any) => {\r\n if (err) return reject(err);\r\n return resolve(name);\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Ensures that all indexes defined in the model's options are created\r\n * @param {function(Error, String[])} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} The names of the indexes\r\n */\r\n ensureIndexes(callback?: General.Callback): Bluebird {\r\n return Bluebird.resolve(this._indexes).map((index: Index.Index | Index.IndexSpecification) => {\r\n return this.ensureIndex((index).spec || index,(index).options || {});\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Drops the index with the specified name if it exists in the collection\r\n * @param {String} name The name of the index to remove\r\n * @param {function(Error, Boolean)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} Whether the index was dropped\r\n */\r\n dropIndex(name: string, callback?: General.Callback): Bluebird;\r\n /**\r\n * Drops the index if it exists in the collection\r\n * @param {IndexSpecification} index The index to remove\r\n * @param {function(Error, Boolean)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} Whether the index was dropped\r\n */\r\n dropIndex(index: Index.IndexSpecification, callback?: General.Callback): Bluebird;\r\n dropIndex(specification: string | Index.IndexSpecification, callback?: General.Callback): Bluebird {\r\n var index: string;\r\n\r\n if (typeof (specification) === 'string') index = specification;\r\n else {\r\n index = _(specification).map((direction, key) => key + '_' + direction).reduce((x, y) => x + '_' + y);\r\n }\r\n\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.dropIndex(index,(err, result: { ok: number }) => {\r\n if (err) return reject(err);\r\n return resolve(!!result.ok);\r\n });\r\n }).nodeify(callback);\r\n }\r\n\r\n /**\r\n * Removes all indexes (except for _id) from the collection\r\n * @param {function(Error, Boolean)} callback A callback which is triggered when the operation completes\r\n * @returns {Promise} Whether the indexes were dropped\r\n */\r\n dropIndexes(callback?: General.Callback): Bluebird {\r\n return new Bluebird((resolve, reject) => {\r\n this.collection.dropAllIndexes((err, count) => {\r\n if (err) return reject(err);\r\n return resolve(count);\r\n });\r\n }).nodeify(callback);\r\n }\r\n}\r\n"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/lib/Model.ts b/lib/Model.ts index ddc724d..1016357 100644 --- a/lib/Model.ts +++ b/lib/Model.ts @@ -61,6 +61,14 @@ export default class Model { this._transforms = instanceType.transforms || {}; this._validators = instanceType.validators || []; this._indexes = instanceType.indexes || []; + + if(!this._schema._id) this._schema._id = MongoDB.ObjectID; + + if(this._schema._id === MongoDB.ObjectID && !this._transforms['_id']) + this._transforms['_id'] = { + fromDB: value => value._bsontype == 'ObjectID' ? new MongoDB.ObjectID(value.id).toHexString() : value, + toDB: value => value && typeof value === 'string' ? new MongoDB.ObjectID(value) : value + }; if ((instanceType).prototype instanceof Instance) this._Instance = ModelSpecificInstance(this, instanceType);