deno.land / x / mongoose@6.7.5 / lib / helpers / timestamps / setupTimestamps.js

setupTimestamps.js
نووسراو ببینە
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
94
95
96
97
98
99
100
101
102
'use strict';
const applyTimestampsToChildren = require('../update/applyTimestampsToChildren');const applyTimestampsToUpdate = require('../update/applyTimestampsToUpdate');const get = require('../get');const handleTimestampOption = require('../schema/handleTimestampOption');const setDocumentTimestamps = require('./setDocumentTimestamps');const symbols = require('../../schema/symbols');
module.exports = function setupTimestamps(schema, timestamps) { const childHasTimestamp = schema.childSchemas.find(withTimestamp); function withTimestamp(s) { const ts = s.schema.options.timestamps; return !!ts; }
if (!timestamps && !childHasTimestamp) { return; }
const createdAt = handleTimestampOption(timestamps, 'createdAt'); const updatedAt = handleTimestampOption(timestamps, 'updatedAt'); const currentTime = timestamps != null && timestamps.hasOwnProperty('currentTime') ? timestamps.currentTime : null; const schemaAdditions = {};
schema.$timestamps = { createdAt: createdAt, updatedAt: updatedAt };
if (createdAt && !schema.paths[createdAt]) { const baseImmutableCreatedAt = schema.base != null ? schema.base.get('timestamps.createdAt.immutable') : null; const immutable = baseImmutableCreatedAt != null ? baseImmutableCreatedAt : true; schemaAdditions[createdAt] = { [schema.options.typeKey || 'type']: Date, immutable }; }
if (updatedAt && !schema.paths[updatedAt]) { schemaAdditions[updatedAt] = Date; }
schema.add(schemaAdditions);
schema.pre('save', function timestampsPreSave(next) { const timestampOption = get(this, '$__.saveOptions.timestamps'); if (timestampOption === false) { return next(); }
setDocumentTimestamps(this, timestampOption, currentTime, createdAt, updatedAt);
next(); });
schema.methods.initializeTimestamps = function() { const ts = currentTime != null ? currentTime() : this.constructor.base.now(); if (createdAt && !this.get(createdAt)) { this.$set(createdAt, ts); } if (updatedAt && !this.get(updatedAt)) { this.$set(updatedAt, ts); }
if (this.$isSubdocument) { return this; }
const subdocs = this.$getAllSubdocs(); for (const subdoc of subdocs) { if (subdoc.initializeTimestamps) { subdoc.initializeTimestamps(); } }
return this; };
_setTimestampsOnUpdate[symbols.builtInMiddleware] = true;
const opts = { query: true, model: false }; schema.pre('findOneAndReplace', opts, _setTimestampsOnUpdate); schema.pre('findOneAndUpdate', opts, _setTimestampsOnUpdate); schema.pre('replaceOne', opts, _setTimestampsOnUpdate); schema.pre('update', opts, _setTimestampsOnUpdate); schema.pre('updateOne', opts, _setTimestampsOnUpdate); schema.pre('updateMany', opts, _setTimestampsOnUpdate);
function _setTimestampsOnUpdate(next) { const now = currentTime != null ? currentTime() : this.model.base.now(); // Replacing with null update should still trigger timestamps if (this.op === 'findOneAndReplace' && this.getUpdate() == null) { this.setUpdate({}); } applyTimestampsToUpdate(now, createdAt, updatedAt, this.getUpdate(), this.options, this.schema); applyTimestampsToChildren(now, this.getUpdate(), this.model.schema); next(); }};
mongoose

Version Info

Tagged at
a year ago