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
						
					
					
				| '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;
 | |
| } |