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
			| 
								 
											3 years ago
										 
									 | 
							
								'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;
							 | 
						||
| 
								 | 
							
								}
							 |