ts-patch-mongoose 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -5
- package/dist/cjs/interfaces/IContext.d.ts +2 -3
- package/dist/cjs/interfaces/IContext.d.ts.map +1 -1
- package/dist/cjs/plugin.d.ts.map +1 -1
- package/dist/cjs/plugin.js +100 -59
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/esm/interfaces/IContext.d.ts +2 -3
- package/dist/esm/interfaces/IContext.d.ts.map +1 -1
- package/dist/esm/plugin.d.ts.map +1 -1
- package/dist/esm/plugin.js +100 -59
- package/dist/esm/plugin.js.map +1 -1
- package/dist/types/interfaces/IContext.d.ts +2 -3
- package/dist/types/interfaces/IContext.d.ts.map +1 -1
- package/dist/types/plugin.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/interfaces/IContext.ts +2 -3
- package/src/plugin.ts +110 -64
- package/tests/constants/events.ts +3 -3
- package/tests/plugin-event-created..test.ts +135 -0
- package/tests/plugin-event-deleted.test.ts +254 -0
- package/tests/plugin.test.ts +26 -26
- package/tests/utils/filesystem.ts +0 -13
package/README.md
CHANGED
|
@@ -82,6 +82,7 @@ const UserSchema = new Schema<IUser>({
|
|
|
82
82
|
},
|
|
83
83
|
role: {
|
|
84
84
|
type: String,
|
|
85
|
+
enum: ['admin', 'manager', 'user'],
|
|
85
86
|
required: true
|
|
86
87
|
}
|
|
87
88
|
}, { timestamps: true })
|
|
@@ -107,22 +108,37 @@ export default User
|
|
|
107
108
|
|
|
108
109
|
## Subscribe
|
|
109
110
|
|
|
110
|
-
You can subscribe to events using patchEventEmitter anywhere in your application
|
|
111
|
+
You can subscribe to events using patchEventEmitter anywhere in your application `handlers/UserHandler.ts`
|
|
111
112
|
|
|
112
113
|
```typescript
|
|
113
114
|
import { patchEventEmitter } from 'ts-patch-mongoose'
|
|
114
115
|
import { USER_CREATED, USER_UPDATED, USER_DELETED } from '../constants/events'
|
|
115
116
|
|
|
116
117
|
patchEventEmitter.on(USER_CREATED, ({ doc }) => {
|
|
117
|
-
|
|
118
|
+
try {
|
|
119
|
+
console.log('Event - user created', doc)
|
|
120
|
+
// Do something with doc here
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error(error)
|
|
123
|
+
}
|
|
118
124
|
})
|
|
119
125
|
|
|
120
126
|
patchEventEmitter.on(USER_UPDATED, ({ doc, oldDoc, patch }) => {
|
|
121
|
-
|
|
127
|
+
try {
|
|
128
|
+
console.log('Event - user updated', doc, oldDoc, patch)
|
|
129
|
+
// Do something with doc, oldDoc and patch here
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error(error)
|
|
132
|
+
}
|
|
122
133
|
})
|
|
123
134
|
|
|
124
|
-
patchEventEmitter.on(USER_DELETED, ({
|
|
125
|
-
|
|
135
|
+
patchEventEmitter.on(USER_DELETED, ({ oldDoc }) => {
|
|
136
|
+
try {
|
|
137
|
+
console.log('Event - user deleted', oldDoc)
|
|
138
|
+
// Do something with doc here
|
|
139
|
+
} catch (error) {
|
|
140
|
+
console.error(error)
|
|
141
|
+
}
|
|
126
142
|
})
|
|
127
143
|
```
|
|
128
144
|
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import type { HydratedDocument
|
|
1
|
+
import type { HydratedDocument } from 'mongoose';
|
|
2
2
|
interface IContext<T> {
|
|
3
3
|
op: string;
|
|
4
4
|
modelName: string;
|
|
5
5
|
collectionName: string;
|
|
6
6
|
isNew?: boolean;
|
|
7
|
-
|
|
7
|
+
createdDocs?: HydratedDocument<T>[];
|
|
8
8
|
deletedDocs?: HydratedDocument<T>[];
|
|
9
|
-
updatedIds?: Types.ObjectId[];
|
|
10
9
|
}
|
|
11
10
|
export default IContext;
|
|
12
11
|
//# sourceMappingURL=IContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IContext.d.ts","sourceRoot":"","sources":["../../../src/interfaces/IContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"IContext.d.ts","sourceRoot":"","sources":["../../../src/interfaces/IContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,UAAU,QAAQ,CAAC,CAAC;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;IACnC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;CACpC;AAED,eAAe,QAAQ,CAAA"}
|
package/dist/cjs/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AA2G7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA2JlG,CAAA"}
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -47,16 +47,47 @@ async function updatePatch(opts, context, current, original) {
|
|
|
47
47
|
version
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
async function
|
|
51
|
-
|
|
50
|
+
async function bulkPatch(opts, context, eventKey, docsKey) {
|
|
51
|
+
const event = opts[eventKey];
|
|
52
|
+
const docs = context[docsKey];
|
|
53
|
+
const key = eventKey === 'eventCreated' ? 'doc' : 'oldDoc';
|
|
54
|
+
if (lodash_1.default.isEmpty(docs) || (!event && opts.patchHistoryDisabled))
|
|
52
55
|
return;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
const chunks = lodash_1.default.chunk(docs, 1000);
|
|
57
|
+
for await (const chunk of chunks) {
|
|
58
|
+
const bulk = [];
|
|
59
|
+
for (const doc of chunk) {
|
|
60
|
+
if (event)
|
|
61
|
+
em_1.default.emit(event, { [key]: doc });
|
|
62
|
+
if (!opts.patchHistoryDisabled) {
|
|
63
|
+
bulk.push({
|
|
64
|
+
insertOne: {
|
|
65
|
+
document: {
|
|
66
|
+
op: context.op,
|
|
67
|
+
modelName: context.modelName,
|
|
68
|
+
collectionName: context.collectionName,
|
|
69
|
+
collectionId: doc._id,
|
|
70
|
+
doc,
|
|
71
|
+
version: 0
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!opts.patchHistoryDisabled) {
|
|
78
|
+
await History_1.default
|
|
79
|
+
.bulkWrite(bulk, { ordered: false })
|
|
80
|
+
.catch((err) => {
|
|
81
|
+
console.error(err);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function createPatch(opts, context) {
|
|
87
|
+
await bulkPatch(opts, context, 'eventCreated', 'createdDocs');
|
|
88
|
+
}
|
|
89
|
+
async function deletePatch(opts, context) {
|
|
90
|
+
await bulkPatch(opts, context, 'eventDeleted', 'deletedDocs');
|
|
60
91
|
}
|
|
61
92
|
exports.patchEventEmitter = em_1.default;
|
|
62
93
|
const patchHistoryPlugin = function plugin(schema, opts) {
|
|
@@ -66,14 +97,12 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
66
97
|
const context = {
|
|
67
98
|
op: this.isNew ? 'create' : 'update',
|
|
68
99
|
modelName: opts.modelName ?? model.modelName,
|
|
69
|
-
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
100
|
+
collectionName: opts.collectionName ?? model.collection.collectionName,
|
|
101
|
+
createdDocs: [current]
|
|
70
102
|
};
|
|
71
103
|
try {
|
|
72
104
|
if (this.isNew) {
|
|
73
|
-
|
|
74
|
-
em_1.default.emit(opts.eventCreated, { doc: current });
|
|
75
|
-
}
|
|
76
|
-
await createPatch(opts, context, current);
|
|
105
|
+
await createPatch(opts, context);
|
|
77
106
|
}
|
|
78
107
|
else {
|
|
79
108
|
const original = await model.findById(current._id).exec();
|
|
@@ -87,19 +116,27 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
87
116
|
next(error);
|
|
88
117
|
}
|
|
89
118
|
});
|
|
90
|
-
schema.
|
|
119
|
+
schema.post('insertMany', async function (docs) {
|
|
120
|
+
const context = {
|
|
121
|
+
op: 'create',
|
|
122
|
+
modelName: opts.modelName ?? this.modelName,
|
|
123
|
+
collectionName: opts.collectionName ?? this.collection.collectionName,
|
|
124
|
+
createdDocs: docs
|
|
125
|
+
};
|
|
126
|
+
await createPatch(opts, context);
|
|
127
|
+
});
|
|
128
|
+
schema.pre(['update', 'updateOne', 'updateMany', 'findOneAndUpdate'], async function (next) {
|
|
91
129
|
const filter = this.getFilter();
|
|
92
130
|
const update = this.getUpdate();
|
|
93
131
|
const options = this.getOptions();
|
|
94
132
|
const count = await this.model.count(filter).exec();
|
|
95
133
|
const commands = [];
|
|
96
|
-
|
|
134
|
+
this._context = {
|
|
97
135
|
op: this.op,
|
|
98
136
|
modelName: opts.modelName ?? this.model.modelName,
|
|
99
137
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
100
138
|
isNew: options.upsert && count === 0
|
|
101
139
|
};
|
|
102
|
-
this._context = context;
|
|
103
140
|
try {
|
|
104
141
|
const keys = lodash_1.default.keys(update).filter((key) => key.startsWith('$'));
|
|
105
142
|
if (update && !lodash_1.default.isEmpty(keys)) {
|
|
@@ -111,6 +148,7 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
111
148
|
const cursor = this.model.find(filter).cursor();
|
|
112
149
|
await cursor.eachAsync(async (doc) => {
|
|
113
150
|
let current = doc.toObject({ depopulate: true });
|
|
151
|
+
const original = doc.toObject({ depopulate: true });
|
|
114
152
|
current = (0, power_assign_1.assign)(current, update);
|
|
115
153
|
lodash_1.default.forEach(commands, (command) => {
|
|
116
154
|
try {
|
|
@@ -119,7 +157,7 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
119
157
|
catch (error) {
|
|
120
158
|
}
|
|
121
159
|
});
|
|
122
|
-
await updatePatch(opts,
|
|
160
|
+
await updatePatch(opts, this._context, current, original);
|
|
123
161
|
});
|
|
124
162
|
next();
|
|
125
163
|
}
|
|
@@ -127,68 +165,71 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
127
165
|
next(error);
|
|
128
166
|
}
|
|
129
167
|
});
|
|
130
|
-
schema.post(['
|
|
168
|
+
schema.post(['update', 'updateOne', 'updateMany', 'findOneAndUpdate'], async function () {
|
|
131
169
|
const update = this.getUpdate();
|
|
132
170
|
if (update && this._context.isNew) {
|
|
133
171
|
const cursor = this.model.findOne(update).cursor();
|
|
134
|
-
await cursor.eachAsync(
|
|
172
|
+
await cursor.eachAsync((doc) => {
|
|
135
173
|
const current = doc.toObject({ depopulate: true });
|
|
136
|
-
if (
|
|
137
|
-
|
|
174
|
+
if (this._context.createdDocs) {
|
|
175
|
+
this._context.createdDocs.push(current);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
this._context.createdDocs = [current];
|
|
138
179
|
}
|
|
139
|
-
await createPatch(opts, this._context, current);
|
|
140
180
|
});
|
|
181
|
+
await createPatch(opts, this._context);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
schema.pre('remove', async function (next) {
|
|
185
|
+
const original = this.toObject({ depopulate: true });
|
|
186
|
+
const model = this.constructor;
|
|
187
|
+
const context = {
|
|
188
|
+
op: 'delete',
|
|
189
|
+
modelName: opts.modelName ?? model.modelName,
|
|
190
|
+
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
191
|
+
};
|
|
192
|
+
try {
|
|
193
|
+
if (opts.eventDeleted) {
|
|
194
|
+
em_1.default.emit(opts.eventDeleted, { oldDoc: original });
|
|
195
|
+
}
|
|
196
|
+
await deletePatch(opts, context);
|
|
197
|
+
next();
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
next(error);
|
|
141
201
|
}
|
|
142
202
|
});
|
|
143
203
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (next) {
|
|
144
204
|
const filter = this.getFilter();
|
|
145
205
|
const options = this.getOptions();
|
|
146
206
|
const ignore = options.__ignore;
|
|
147
|
-
|
|
207
|
+
if (ignore)
|
|
208
|
+
return next();
|
|
209
|
+
this._context = {
|
|
148
210
|
op: this.op,
|
|
149
211
|
modelName: opts.modelName ?? this.model.modelName,
|
|
150
212
|
collectionName: opts.collectionName ?? this.model.collection.collectionName
|
|
151
213
|
};
|
|
152
|
-
if (!
|
|
153
|
-
|
|
154
|
-
if (
|
|
155
|
-
|
|
214
|
+
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
215
|
+
const docs = await this.model.find(filter).exec();
|
|
216
|
+
if (!lodash_1.default.isEmpty(docs)) {
|
|
217
|
+
this._context.deletedDocs = docs;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const doc = await this.model.findOne(filter).exec();
|
|
222
|
+
if (!lodash_1.default.isEmpty(doc)) {
|
|
223
|
+
this._context.deletedDocs = [doc];
|
|
156
224
|
}
|
|
157
225
|
}
|
|
158
|
-
this._context
|
|
226
|
+
if (opts.preDeleteManyCallback && lodash_1.default.isArray(this._context.deletedDocs) && !lodash_1.default.isEmpty(this._context.deletedDocs)) {
|
|
227
|
+
await opts.preDeleteManyCallback(this._context.deletedDocs);
|
|
228
|
+
}
|
|
159
229
|
next();
|
|
160
230
|
});
|
|
161
231
|
schema.post(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function () {
|
|
162
|
-
|
|
163
|
-
return;
|
|
164
|
-
const chunks = lodash_1.default.chunk(this._context.deletedDocs, 1000);
|
|
165
|
-
for await (const chunk of chunks) {
|
|
166
|
-
const bulk = [];
|
|
167
|
-
for (const oldDoc of chunk) {
|
|
168
|
-
if (opts.eventDeleted) {
|
|
169
|
-
em_1.default.emit(opts.eventDeleted, { oldDoc });
|
|
170
|
-
}
|
|
171
|
-
if (!opts.patchHistoryDisabled) {
|
|
172
|
-
bulk.push({
|
|
173
|
-
insertOne: {
|
|
174
|
-
document: {
|
|
175
|
-
op: this._context.op,
|
|
176
|
-
modelName: this._context.modelName,
|
|
177
|
-
collectionName: this._context.collectionName,
|
|
178
|
-
collectionId: oldDoc._id,
|
|
179
|
-
doc: oldDoc,
|
|
180
|
-
version: 0
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (!opts.patchHistoryDisabled) {
|
|
187
|
-
await History_1.default.bulkWrite(bulk, { ordered: false }).catch((err) => {
|
|
188
|
-
console.error(err);
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
232
|
+
await deletePatch(opts, this._context);
|
|
192
233
|
});
|
|
193
234
|
};
|
|
194
235
|
exports.patchHistoryPlugin = patchHistoryPlugin;
|
package/dist/cjs/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;AAAA,4DAAsB;AACtB,kEAA4B;AAC5B,8EAAuC;AACvC,+CAAqC;AAQrC,sDAAqB;AACrB,uEAAsC;AAEtC,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,KAAK;IACf,KAAK,EAAE,IAAI;CACZ,CAAA;AAED,SAAS,UAAU,CAAK,IAAuB,EAAE,OAA4B,EAAE,QAA6B;IAC1G,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAe,CAAA;IACrE,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAe,CAAA;IAEvE,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,aAAa,GAAG,IAAA,mBAAI,EAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,cAAc,GAAG,IAAA,mBAAI,EAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;KACjD;IAED,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,WAAW,CAAK,IAAuB,EAAE,OAAoB,EAAE,OAA4B,EAAE,QAA6B;IACvI,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;IAE7E,IAAI,gBAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,gBAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAM;IAEjE,MAAM,KAAK,GAAG,yBAAS,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;IAEpE,IAAI,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAM;IAE5B,IAAI,IAAI,CAAC,YAAY,EAAE;QACrB,YAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;KACtE;IAED,IAAI,IAAI,CAAC,oBAAoB;QAAE,OAAM;IAErC,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,MAAM,WAAW,GAAG,MAAM,iBAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;IAEnH,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,IAAI,CAAC,EAAE;QAC3C,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,CAAC,CAAA;KAClC;IAED,MAAM,iBAAO,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,YAAY,EAAE,QAAQ,CAAC,GAAqB;QAC5C,KAAK;QACL,OAAO;KACR,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import type { HydratedDocument
|
|
1
|
+
import type { HydratedDocument } from 'mongoose';
|
|
2
2
|
interface IContext<T> {
|
|
3
3
|
op: string;
|
|
4
4
|
modelName: string;
|
|
5
5
|
collectionName: string;
|
|
6
6
|
isNew?: boolean;
|
|
7
|
-
|
|
7
|
+
createdDocs?: HydratedDocument<T>[];
|
|
8
8
|
deletedDocs?: HydratedDocument<T>[];
|
|
9
|
-
updatedIds?: Types.ObjectId[];
|
|
10
9
|
}
|
|
11
10
|
export default IContext;
|
|
12
11
|
//# sourceMappingURL=IContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IContext.d.ts","sourceRoot":"","sources":["../../../src/interfaces/IContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"IContext.d.ts","sourceRoot":"","sources":["../../../src/interfaces/IContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAEhD,UAAU,QAAQ,CAAC,CAAC;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;IACnC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;CACpC;AAED,eAAe,QAAQ,CAAA"}
|
package/dist/esm/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAKA,OAAO,KAAK,EAAmC,KAAK,EAAiB,MAAM,EAAS,MAAM,UAAU,CAAA;AAEpG,OAAO,KAAK,cAAc,MAAM,6BAA6B,CAAA;AA2G7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA2JlG,CAAA"}
|
package/dist/esm/plugin.js
CHANGED
|
@@ -43,16 +43,47 @@ async function updatePatch(opts, context, current, original) {
|
|
|
43
43
|
version
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
-
async function
|
|
47
|
-
|
|
46
|
+
async function bulkPatch(opts, context, eventKey, docsKey) {
|
|
47
|
+
const event = opts[eventKey];
|
|
48
|
+
const docs = context[docsKey];
|
|
49
|
+
const key = eventKey === 'eventCreated' ? 'doc' : 'oldDoc';
|
|
50
|
+
if (_.isEmpty(docs) || (!event && opts.patchHistoryDisabled))
|
|
48
51
|
return;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
const chunks = _.chunk(docs, 1000);
|
|
53
|
+
for await (const chunk of chunks) {
|
|
54
|
+
const bulk = [];
|
|
55
|
+
for (const doc of chunk) {
|
|
56
|
+
if (event)
|
|
57
|
+
em.emit(event, { [key]: doc });
|
|
58
|
+
if (!opts.patchHistoryDisabled) {
|
|
59
|
+
bulk.push({
|
|
60
|
+
insertOne: {
|
|
61
|
+
document: {
|
|
62
|
+
op: context.op,
|
|
63
|
+
modelName: context.modelName,
|
|
64
|
+
collectionName: context.collectionName,
|
|
65
|
+
collectionId: doc._id,
|
|
66
|
+
doc,
|
|
67
|
+
version: 0
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!opts.patchHistoryDisabled) {
|
|
74
|
+
await History
|
|
75
|
+
.bulkWrite(bulk, { ordered: false })
|
|
76
|
+
.catch((err) => {
|
|
77
|
+
console.error(err);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async function createPatch(opts, context) {
|
|
83
|
+
await bulkPatch(opts, context, 'eventCreated', 'createdDocs');
|
|
84
|
+
}
|
|
85
|
+
async function deletePatch(opts, context) {
|
|
86
|
+
await bulkPatch(opts, context, 'eventDeleted', 'deletedDocs');
|
|
56
87
|
}
|
|
57
88
|
export const patchEventEmitter = em;
|
|
58
89
|
export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
@@ -62,14 +93,12 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
62
93
|
const context = {
|
|
63
94
|
op: this.isNew ? 'create' : 'update',
|
|
64
95
|
modelName: opts.modelName ?? model.modelName,
|
|
65
|
-
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
96
|
+
collectionName: opts.collectionName ?? model.collection.collectionName,
|
|
97
|
+
createdDocs: [current]
|
|
66
98
|
};
|
|
67
99
|
try {
|
|
68
100
|
if (this.isNew) {
|
|
69
|
-
|
|
70
|
-
em.emit(opts.eventCreated, { doc: current });
|
|
71
|
-
}
|
|
72
|
-
await createPatch(opts, context, current);
|
|
101
|
+
await createPatch(opts, context);
|
|
73
102
|
}
|
|
74
103
|
else {
|
|
75
104
|
const original = await model.findById(current._id).exec();
|
|
@@ -83,19 +112,27 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
83
112
|
next(error);
|
|
84
113
|
}
|
|
85
114
|
});
|
|
86
|
-
schema.
|
|
115
|
+
schema.post('insertMany', async function (docs) {
|
|
116
|
+
const context = {
|
|
117
|
+
op: 'create',
|
|
118
|
+
modelName: opts.modelName ?? this.modelName,
|
|
119
|
+
collectionName: opts.collectionName ?? this.collection.collectionName,
|
|
120
|
+
createdDocs: docs
|
|
121
|
+
};
|
|
122
|
+
await createPatch(opts, context);
|
|
123
|
+
});
|
|
124
|
+
schema.pre(['update', 'updateOne', 'updateMany', 'findOneAndUpdate'], async function (next) {
|
|
87
125
|
const filter = this.getFilter();
|
|
88
126
|
const update = this.getUpdate();
|
|
89
127
|
const options = this.getOptions();
|
|
90
128
|
const count = await this.model.count(filter).exec();
|
|
91
129
|
const commands = [];
|
|
92
|
-
|
|
130
|
+
this._context = {
|
|
93
131
|
op: this.op,
|
|
94
132
|
modelName: opts.modelName ?? this.model.modelName,
|
|
95
133
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
96
134
|
isNew: options.upsert && count === 0
|
|
97
135
|
};
|
|
98
|
-
this._context = context;
|
|
99
136
|
try {
|
|
100
137
|
const keys = _.keys(update).filter((key) => key.startsWith('$'));
|
|
101
138
|
if (update && !_.isEmpty(keys)) {
|
|
@@ -107,6 +144,7 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
107
144
|
const cursor = this.model.find(filter).cursor();
|
|
108
145
|
await cursor.eachAsync(async (doc) => {
|
|
109
146
|
let current = doc.toObject({ depopulate: true });
|
|
147
|
+
const original = doc.toObject({ depopulate: true });
|
|
110
148
|
current = assign(current, update);
|
|
111
149
|
_.forEach(commands, (command) => {
|
|
112
150
|
try {
|
|
@@ -115,7 +153,7 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
115
153
|
catch (error) {
|
|
116
154
|
}
|
|
117
155
|
});
|
|
118
|
-
await updatePatch(opts,
|
|
156
|
+
await updatePatch(opts, this._context, current, original);
|
|
119
157
|
});
|
|
120
158
|
next();
|
|
121
159
|
}
|
|
@@ -123,68 +161,71 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
123
161
|
next(error);
|
|
124
162
|
}
|
|
125
163
|
});
|
|
126
|
-
schema.post(['
|
|
164
|
+
schema.post(['update', 'updateOne', 'updateMany', 'findOneAndUpdate'], async function () {
|
|
127
165
|
const update = this.getUpdate();
|
|
128
166
|
if (update && this._context.isNew) {
|
|
129
167
|
const cursor = this.model.findOne(update).cursor();
|
|
130
|
-
await cursor.eachAsync(
|
|
168
|
+
await cursor.eachAsync((doc) => {
|
|
131
169
|
const current = doc.toObject({ depopulate: true });
|
|
132
|
-
if (
|
|
133
|
-
|
|
170
|
+
if (this._context.createdDocs) {
|
|
171
|
+
this._context.createdDocs.push(current);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
this._context.createdDocs = [current];
|
|
134
175
|
}
|
|
135
|
-
await createPatch(opts, this._context, current);
|
|
136
176
|
});
|
|
177
|
+
await createPatch(opts, this._context);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
schema.pre('remove', async function (next) {
|
|
181
|
+
const original = this.toObject({ depopulate: true });
|
|
182
|
+
const model = this.constructor;
|
|
183
|
+
const context = {
|
|
184
|
+
op: 'delete',
|
|
185
|
+
modelName: opts.modelName ?? model.modelName,
|
|
186
|
+
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
187
|
+
};
|
|
188
|
+
try {
|
|
189
|
+
if (opts.eventDeleted) {
|
|
190
|
+
em.emit(opts.eventDeleted, { oldDoc: original });
|
|
191
|
+
}
|
|
192
|
+
await deletePatch(opts, context);
|
|
193
|
+
next();
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
next(error);
|
|
137
197
|
}
|
|
138
198
|
});
|
|
139
199
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (next) {
|
|
140
200
|
const filter = this.getFilter();
|
|
141
201
|
const options = this.getOptions();
|
|
142
202
|
const ignore = options.__ignore;
|
|
143
|
-
|
|
203
|
+
if (ignore)
|
|
204
|
+
return next();
|
|
205
|
+
this._context = {
|
|
144
206
|
op: this.op,
|
|
145
207
|
modelName: opts.modelName ?? this.model.modelName,
|
|
146
208
|
collectionName: opts.collectionName ?? this.model.collection.collectionName
|
|
147
209
|
};
|
|
148
|
-
if (!
|
|
149
|
-
|
|
150
|
-
if (
|
|
151
|
-
|
|
210
|
+
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
211
|
+
const docs = await this.model.find(filter).exec();
|
|
212
|
+
if (!_.isEmpty(docs)) {
|
|
213
|
+
this._context.deletedDocs = docs;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
const doc = await this.model.findOne(filter).exec();
|
|
218
|
+
if (!_.isEmpty(doc)) {
|
|
219
|
+
this._context.deletedDocs = [doc];
|
|
152
220
|
}
|
|
153
221
|
}
|
|
154
|
-
this._context
|
|
222
|
+
if (opts.preDeleteManyCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
|
|
223
|
+
await opts.preDeleteManyCallback(this._context.deletedDocs);
|
|
224
|
+
}
|
|
155
225
|
next();
|
|
156
226
|
});
|
|
157
227
|
schema.post(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function () {
|
|
158
|
-
|
|
159
|
-
return;
|
|
160
|
-
const chunks = _.chunk(this._context.deletedDocs, 1000);
|
|
161
|
-
for await (const chunk of chunks) {
|
|
162
|
-
const bulk = [];
|
|
163
|
-
for (const oldDoc of chunk) {
|
|
164
|
-
if (opts.eventDeleted) {
|
|
165
|
-
em.emit(opts.eventDeleted, { oldDoc });
|
|
166
|
-
}
|
|
167
|
-
if (!opts.patchHistoryDisabled) {
|
|
168
|
-
bulk.push({
|
|
169
|
-
insertOne: {
|
|
170
|
-
document: {
|
|
171
|
-
op: this._context.op,
|
|
172
|
-
modelName: this._context.modelName,
|
|
173
|
-
collectionName: this._context.collectionName,
|
|
174
|
-
collectionId: oldDoc._id,
|
|
175
|
-
doc: oldDoc,
|
|
176
|
-
version: 0
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (!opts.patchHistoryDisabled) {
|
|
183
|
-
await History.bulkWrite(bulk, { ordered: false }).catch((err) => {
|
|
184
|
-
console.error(err);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
228
|
+
await deletePatch(opts, this._context);
|
|
188
229
|
});
|
|
189
230
|
};
|
|
190
231
|
//# sourceMappingURL=plugin.js.map
|