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