You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					93 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					93 lines
				
				2.2 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | /*! | ||
|  |  * ignore | ||
|  |  */ | ||
|  | 
 | ||
|  | module.exports = applyQueryMiddleware; | ||
|  | 
 | ||
|  | /*! | ||
|  |  * ignore | ||
|  |  */ | ||
|  | 
 | ||
|  | applyQueryMiddleware.middlewareFunctions = [ | ||
|  |   'count', | ||
|  |   'countDocuments', | ||
|  |   'deleteMany', | ||
|  |   'deleteOne', | ||
|  |   'distinct', | ||
|  |   'estimatedDocumentCount', | ||
|  |   'find', | ||
|  |   'findOne', | ||
|  |   'findOneAndDelete', | ||
|  |   'findOneAndRemove', | ||
|  |   'findOneAndReplace', | ||
|  |   'findOneAndUpdate', | ||
|  |   'remove', | ||
|  |   'replaceOne', | ||
|  |   'update', | ||
|  |   'updateMany', | ||
|  |   'updateOne', | ||
|  |   'validate' | ||
|  | ]; | ||
|  | 
 | ||
|  | /*! | ||
|  |  * Apply query middleware | ||
|  |  * | ||
|  |  * @param {Query} query constructor | ||
|  |  * @param {Model} model | ||
|  |  */ | ||
|  | 
 | ||
|  | function applyQueryMiddleware(Query, model) { | ||
|  |   const kareemOptions = { | ||
|  |     useErrorHandlers: true, | ||
|  |     numCallbackParams: 1, | ||
|  |     nullResultByDefault: true | ||
|  |   }; | ||
|  | 
 | ||
|  |   const middleware = model.hooks.filter(hook => { | ||
|  |     const contexts = _getContexts(hook); | ||
|  |     if (hook.name === 'updateOne') { | ||
|  |       return contexts.query == null || !!contexts.query; | ||
|  |     } | ||
|  |     if (hook.name === 'deleteOne') { | ||
|  |       return !!contexts.query || Object.keys(contexts).length === 0; | ||
|  |     } | ||
|  |     if (hook.name === 'validate' || hook.name === 'remove') { | ||
|  |       return !!contexts.query; | ||
|  |     } | ||
|  |     if (hook.query != null || hook.document != null) { | ||
|  |       return !!hook.query; | ||
|  |     } | ||
|  |     return true; | ||
|  |   }); | ||
|  | 
 | ||
|  |   // `update()` thunk has a different name because `_update` was already taken
 | ||
|  |   Query.prototype._execUpdate = middleware.createWrapper('update', | ||
|  |     Query.prototype._execUpdate, null, kareemOptions); | ||
|  |   // `distinct()` thunk has a different name because `_distinct` was already taken
 | ||
|  |   Query.prototype.__distinct = middleware.createWrapper('distinct', | ||
|  |     Query.prototype.__distinct, null, kareemOptions); | ||
|  | 
 | ||
|  |   // `validate()` doesn't have a thunk because it doesn't execute a query.
 | ||
|  |   Query.prototype.validate = middleware.createWrapper('validate', | ||
|  |     Query.prototype.validate, null, kareemOptions); | ||
|  | 
 | ||
|  |   applyQueryMiddleware.middlewareFunctions. | ||
|  |     filter(v => v !== 'update' && v !== 'distinct' && v !== 'validate'). | ||
|  |     forEach(fn => { | ||
|  |       Query.prototype[`_${fn}`] = middleware.createWrapper(fn, | ||
|  |         Query.prototype[`_${fn}`], null, kareemOptions); | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | function _getContexts(hook) { | ||
|  |   const ret = {}; | ||
|  |   if (hook.hasOwnProperty('query')) { | ||
|  |     ret.query = hook.query; | ||
|  |   } | ||
|  |   if (hook.hasOwnProperty('document')) { | ||
|  |     ret.document = hook.document; | ||
|  |   } | ||
|  |   return ret; | ||
|  | } |