gx
chenyc
2025-06-12 7b72ac13a83764a662159d4a49b7fffb90476ecb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
'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;
}