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