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.
		
		
		
		
		
			
		
			
				
					
					
						
							120 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							120 lines
						
					
					
						
							3.2 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| /*!
 | |
|  * ignore
 | |
|  */
 | |
| 
 | |
| const get = require('../get');
 | |
| 
 | |
| module.exports = applyTimestampsToUpdate;
 | |
| 
 | |
| /*!
 | |
|  * ignore
 | |
|  */
 | |
| 
 | |
| function applyTimestampsToUpdate(now, createdAt, updatedAt, currentUpdate, options) {
 | |
|   const updates = currentUpdate;
 | |
|   let _updates = updates;
 | |
|   const overwrite = get(options, 'overwrite', false);
 | |
|   const timestamps = get(options, 'timestamps', true);
 | |
| 
 | |
|   // Support skipping timestamps at the query level, see gh-6980
 | |
|   if (!timestamps || updates == null) {
 | |
|     return currentUpdate;
 | |
|   }
 | |
| 
 | |
|   const skipCreatedAt = timestamps != null && timestamps.createdAt === false;
 | |
|   const skipUpdatedAt = timestamps != null && timestamps.updatedAt === false;
 | |
| 
 | |
|   if (overwrite) {
 | |
|     if (currentUpdate && currentUpdate.$set) {
 | |
|       currentUpdate = currentUpdate.$set;
 | |
|       updates.$set = {};
 | |
|       _updates = updates.$set;
 | |
|     }
 | |
|     if (!skipUpdatedAt && updatedAt && !currentUpdate[updatedAt]) {
 | |
|       _updates[updatedAt] = now;
 | |
|     }
 | |
|     if (!skipCreatedAt && createdAt && !currentUpdate[createdAt]) {
 | |
|       _updates[createdAt] = now;
 | |
|     }
 | |
|     return updates;
 | |
|   }
 | |
|   currentUpdate = currentUpdate || {};
 | |
| 
 | |
|   if (Array.isArray(updates)) {
 | |
|     // Update with aggregation pipeline
 | |
|     updates.push({ $set: { updatedAt: now } });
 | |
| 
 | |
|     return updates;
 | |
|   }
 | |
| 
 | |
|   updates.$set = updates.$set || {};
 | |
|   if (!skipUpdatedAt && updatedAt &&
 | |
|       (!currentUpdate.$currentDate || !currentUpdate.$currentDate[updatedAt])) {
 | |
|     let timestampSet = false;
 | |
|     if (updatedAt.indexOf('.') !== -1) {
 | |
|       const pieces = updatedAt.split('.');
 | |
|       for (let i = 1; i < pieces.length; ++i) {
 | |
|         const remnant = pieces.slice(-i).join('.');
 | |
|         const start = pieces.slice(0, -i).join('.');
 | |
|         if (currentUpdate[start] != null) {
 | |
|           currentUpdate[start][remnant] = now;
 | |
|           timestampSet = true;
 | |
|           break;
 | |
|         } else if (currentUpdate.$set && currentUpdate.$set[start]) {
 | |
|           currentUpdate.$set[start][remnant] = now;
 | |
|           timestampSet = true;
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (!timestampSet) {
 | |
|       updates.$set[updatedAt] = now;
 | |
|     }
 | |
| 
 | |
|     if (updates.hasOwnProperty(updatedAt)) {
 | |
|       delete updates[updatedAt];
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (!skipCreatedAt && createdAt) {
 | |
|     if (currentUpdate[createdAt]) {
 | |
|       delete currentUpdate[createdAt];
 | |
|     }
 | |
|     if (currentUpdate.$set && currentUpdate.$set[createdAt]) {
 | |
|       delete currentUpdate.$set[createdAt];
 | |
|     }
 | |
| 
 | |
|     let timestampSet = false;
 | |
|     if (createdAt.indexOf('.') !== -1) {
 | |
|       const pieces = createdAt.split('.');
 | |
|       for (let i = 1; i < pieces.length; ++i) {
 | |
|         const remnant = pieces.slice(-i).join('.');
 | |
|         const start = pieces.slice(0, -i).join('.');
 | |
|         if (currentUpdate[start] != null) {
 | |
|           currentUpdate[start][remnant] = now;
 | |
|           timestampSet = true;
 | |
|           break;
 | |
|         } else if (currentUpdate.$set && currentUpdate.$set[start]) {
 | |
|           currentUpdate.$set[start][remnant] = now;
 | |
|           timestampSet = true;
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (!timestampSet) {
 | |
|       updates.$setOnInsert = updates.$setOnInsert || {};
 | |
|       updates.$setOnInsert[createdAt] = now;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (Object.keys(updates.$set).length === 0) {
 | |
|     delete updates.$set;
 | |
|   }
 | |
| 
 | |
|   return updates;
 | |
| }
 |