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.
		
		
		
		
		
			
		
			
				
					
					
						
							71 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
	
	
							71 lines
						
					
					
						
							2.3 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| const middlewareFunctions = require('../query/applyQueryMiddleware').middlewareFunctions;
 | |
| const promiseOrCallback = require('../promiseOrCallback');
 | |
| 
 | |
| module.exports = function applyStaticHooks(model, hooks, statics) {
 | |
|   const kareemOptions = {
 | |
|     useErrorHandlers: true,
 | |
|     numCallbackParams: 1
 | |
|   };
 | |
| 
 | |
|   hooks = hooks.filter(hook => {
 | |
|     // If the custom static overwrites an existing query middleware, don't apply
 | |
|     // middleware to it by default. This avoids a potential backwards breaking
 | |
|     // change with plugins like `mongoose-delete` that use statics to overwrite
 | |
|     // built-in Mongoose functions.
 | |
|     if (middlewareFunctions.indexOf(hook.name) !== -1) {
 | |
|       return !!hook.model;
 | |
|     }
 | |
|     return hook.model !== false;
 | |
|   });
 | |
| 
 | |
|   model.$__insertMany = hooks.createWrapper('insertMany',
 | |
|     model.$__insertMany, model, kareemOptions);
 | |
| 
 | |
|   for (const key of Object.keys(statics)) {
 | |
|     if (hooks.hasHooks(key)) {
 | |
|       const original = model[key];
 | |
| 
 | |
|       model[key] = function() {
 | |
|         const numArgs = arguments.length;
 | |
|         const lastArg = numArgs > 0 ? arguments[numArgs - 1] : null;
 | |
|         const cb = typeof lastArg === 'function' ? lastArg : null;
 | |
|         const args = Array.prototype.slice.
 | |
|           call(arguments, 0, cb == null ? numArgs : numArgs - 1);
 | |
|         // Special case: can't use `Kareem#wrap()` because it doesn't currently
 | |
|         // support wrapped functions that return a promise.
 | |
|         return promiseOrCallback(cb, callback => {
 | |
|           hooks.execPre(key, model, args, function(err) {
 | |
|             if (err != null) {
 | |
|               return callback(err);
 | |
|             }
 | |
| 
 | |
|             let postCalled = 0;
 | |
|             const ret = original.apply(model, args.concat(post));
 | |
|             if (ret != null && typeof ret.then === 'function') {
 | |
|               ret.then(res => post(null, res), err => post(err));
 | |
|             }
 | |
| 
 | |
|             function post(error, res) {
 | |
|               if (postCalled++ > 0) {
 | |
|                 return;
 | |
|               }
 | |
| 
 | |
|               if (error != null) {
 | |
|                 return callback(error);
 | |
|               }
 | |
| 
 | |
|               hooks.execPost(key, model, [res], function(error) {
 | |
|                 if (error != null) {
 | |
|                   return callback(error);
 | |
|                 }
 | |
|                 callback(null, res);
 | |
|               });
 | |
|             }
 | |
|           });
 | |
|         }, model.events);
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| }; |