ts-patch-mongoose 1.0.5 → 1.0.7
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 +42 -7
- package/dist/cjs/plugin.d.ts.map +1 -1
- package/dist/cjs/plugin.js +72 -39
- package/dist/cjs/plugin.js.map +1 -1
- package/dist/esm/plugin.d.ts.map +1 -1
- package/dist/esm/plugin.js +72 -39
- package/dist/esm/plugin.js.map +1 -1
- package/dist/types/plugin.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/plugin.ts +80 -45
- package/tests/constants/events.ts +3 -3
- package/tests/plugin-event-deleted.test.ts +255 -0
- package/tests/plugin.test.ts +26 -26
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# ts-patch-mongoose
|
|
2
2
|
|
|
3
|
-
Patch history & events for mongoose
|
|
3
|
+
Patch history & events plugin for mongoose
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/ts-patch-mongoose)
|
|
6
6
|
[](https://www.npmjs.com/package/ts-patch-mongoose)
|
|
@@ -19,7 +19,7 @@ Patch history & events for mongoose models
|
|
|
19
19
|
|
|
20
20
|
ts-patch-mongoose is a plugin for mongoose
|
|
21
21
|
\
|
|
22
|
-
I
|
|
22
|
+
I need to track changes of mongoose models and save them as patch history (audit log) in separate collection. Changes must also emit events that I can subscribe to and react in other parts of my application. I also want to omit some fields from patch history.
|
|
23
23
|
|
|
24
24
|
## Features
|
|
25
25
|
|
|
@@ -42,6 +42,8 @@ yarn add ts-patch-mongoose
|
|
|
42
42
|
|
|
43
43
|
## Example
|
|
44
44
|
|
|
45
|
+
How to use it with express [ts-express-swc](https://github.com/ilovepixelart/ts-express-swc)
|
|
46
|
+
|
|
45
47
|
Create your event constants `events.ts`
|
|
46
48
|
|
|
47
49
|
```typescript
|
|
@@ -50,6 +52,19 @@ export const USER_UPDATED = 'user-updated'
|
|
|
50
52
|
export const USER_DELETED = 'user-deleted'
|
|
51
53
|
```
|
|
52
54
|
|
|
55
|
+
Create your interface `IUser.ts`
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
interface IUser {
|
|
59
|
+
name: string
|
|
60
|
+
role: string
|
|
61
|
+
createdAt?: Date
|
|
62
|
+
updatedAt?: Date
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default IUser
|
|
66
|
+
```
|
|
67
|
+
|
|
53
68
|
Setup your mongoose model `User.ts`
|
|
54
69
|
|
|
55
70
|
```typescript
|
|
@@ -67,6 +82,7 @@ const UserSchema = new Schema<IUser>({
|
|
|
67
82
|
},
|
|
68
83
|
role: {
|
|
69
84
|
type: String,
|
|
85
|
+
enum: ['admin', 'manager', 'user'],
|
|
70
86
|
required: true
|
|
71
87
|
}
|
|
72
88
|
}, { timestamps: true })
|
|
@@ -92,21 +108,40 @@ export default User
|
|
|
92
108
|
|
|
93
109
|
## Subscribe
|
|
94
110
|
|
|
95
|
-
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`
|
|
96
112
|
|
|
97
113
|
```typescript
|
|
98
114
|
import { patchEventEmitter } from 'ts-patch-mongoose'
|
|
99
115
|
import { USER_CREATED, USER_UPDATED, USER_DELETED } from '../constants/events'
|
|
100
116
|
|
|
101
117
|
patchEventEmitter.on(USER_CREATED, ({ doc }) => {
|
|
102
|
-
|
|
118
|
+
try {
|
|
119
|
+
console.log('Event - user created', doc)
|
|
120
|
+
// Do something with doc here
|
|
121
|
+
} catch (error) {
|
|
122
|
+
console.error(error)
|
|
123
|
+
}
|
|
103
124
|
})
|
|
104
125
|
|
|
105
126
|
patchEventEmitter.on(USER_UPDATED, ({ doc, oldDoc, patch }) => {
|
|
106
|
-
|
|
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
|
+
}
|
|
107
133
|
})
|
|
108
134
|
|
|
109
|
-
patchEventEmitter.on(USER_DELETED, ({
|
|
110
|
-
|
|
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
|
+
}
|
|
111
142
|
})
|
|
112
143
|
```
|
|
144
|
+
|
|
145
|
+
## Check my other projects
|
|
146
|
+
|
|
147
|
+
- [ts-migrate-mongoose](https://github.com/ilovepixelart/ts-migrate-mongoose) - Migration framework for mongoose
|
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;AA4G7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA+IlG,CAAA"}
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -58,6 +58,40 @@ async function createPatch(opts, context, current) {
|
|
|
58
58
|
doc: current
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
|
+
async function deletePatch(opts, context) {
|
|
62
|
+
if (lodash_1.default.isEmpty(context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled))
|
|
63
|
+
return;
|
|
64
|
+
const chunks = lodash_1.default.chunk(context.deletedDocs, 1000);
|
|
65
|
+
for await (const chunk of chunks) {
|
|
66
|
+
const bulk = [];
|
|
67
|
+
for (const oldDoc of chunk) {
|
|
68
|
+
if (opts.eventDeleted) {
|
|
69
|
+
em_1.default.emit(opts.eventDeleted, { oldDoc });
|
|
70
|
+
}
|
|
71
|
+
if (!opts.patchHistoryDisabled) {
|
|
72
|
+
bulk.push({
|
|
73
|
+
insertOne: {
|
|
74
|
+
document: {
|
|
75
|
+
op: context.op,
|
|
76
|
+
modelName: context.modelName,
|
|
77
|
+
collectionName: context.collectionName,
|
|
78
|
+
collectionId: oldDoc._id,
|
|
79
|
+
doc: oldDoc,
|
|
80
|
+
version: 0
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (!opts.patchHistoryDisabled) {
|
|
87
|
+
await History_1.default
|
|
88
|
+
.bulkWrite(bulk, { ordered: false })
|
|
89
|
+
.catch((err) => {
|
|
90
|
+
console.error(err);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
61
95
|
exports.patchEventEmitter = em_1.default;
|
|
62
96
|
const patchHistoryPlugin = function plugin(schema, opts) {
|
|
63
97
|
schema.pre('save', async function (next) {
|
|
@@ -93,13 +127,12 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
93
127
|
const options = this.getOptions();
|
|
94
128
|
const count = await this.model.count(filter).exec();
|
|
95
129
|
const commands = [];
|
|
96
|
-
|
|
130
|
+
this._context = {
|
|
97
131
|
op: this.op,
|
|
98
132
|
modelName: opts.modelName ?? this.model.modelName,
|
|
99
133
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
100
134
|
isNew: options.upsert && count === 0
|
|
101
135
|
};
|
|
102
|
-
this._context = context;
|
|
103
136
|
try {
|
|
104
137
|
const keys = lodash_1.default.keys(update).filter((key) => key.startsWith('$'));
|
|
105
138
|
if (update && !lodash_1.default.isEmpty(keys)) {
|
|
@@ -119,7 +152,7 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
119
152
|
catch (error) {
|
|
120
153
|
}
|
|
121
154
|
});
|
|
122
|
-
await updatePatch(opts,
|
|
155
|
+
await updatePatch(opts, this._context, current, doc.toObject({ depopulate: true }));
|
|
123
156
|
});
|
|
124
157
|
next();
|
|
125
158
|
}
|
|
@@ -140,55 +173,55 @@ const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
140
173
|
});
|
|
141
174
|
}
|
|
142
175
|
});
|
|
176
|
+
schema.pre('remove', async function (next) {
|
|
177
|
+
const original = this.toObject({ depopulate: true });
|
|
178
|
+
const model = this.constructor;
|
|
179
|
+
const context = {
|
|
180
|
+
op: 'delete',
|
|
181
|
+
modelName: opts.modelName ?? model.modelName,
|
|
182
|
+
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
183
|
+
};
|
|
184
|
+
try {
|
|
185
|
+
if (opts.eventDeleted) {
|
|
186
|
+
em_1.default.emit(opts.eventDeleted, { oldDoc: original });
|
|
187
|
+
}
|
|
188
|
+
await deletePatch(opts, context);
|
|
189
|
+
next();
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
next(error);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
143
195
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (next) {
|
|
144
196
|
const filter = this.getFilter();
|
|
145
197
|
const options = this.getOptions();
|
|
146
198
|
const ignore = options.__ignore;
|
|
147
|
-
|
|
199
|
+
if (ignore)
|
|
200
|
+
return next();
|
|
201
|
+
this._context = {
|
|
148
202
|
op: this.op,
|
|
149
203
|
modelName: opts.modelName ?? this.model.modelName,
|
|
150
204
|
collectionName: opts.collectionName ?? this.model.collection.collectionName
|
|
151
205
|
};
|
|
152
|
-
if (!
|
|
153
|
-
|
|
154
|
-
if (
|
|
155
|
-
|
|
206
|
+
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
207
|
+
const docs = await this.model.find(filter).exec();
|
|
208
|
+
if (!lodash_1.default.isEmpty(docs)) {
|
|
209
|
+
this._context.deletedDocs = docs;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
const doc = await this.model.findOne(filter).exec();
|
|
214
|
+
if (!lodash_1.default.isEmpty(doc)) {
|
|
215
|
+
this._context.deletedDocs = [doc];
|
|
156
216
|
}
|
|
157
217
|
}
|
|
158
|
-
this._context
|
|
218
|
+
if (opts.preDeleteManyCallback && lodash_1.default.isArray(this._context.deletedDocs) && !lodash_1.default.isEmpty(this._context.deletedDocs)) {
|
|
219
|
+
await opts.preDeleteManyCallback(this._context.deletedDocs);
|
|
220
|
+
}
|
|
159
221
|
next();
|
|
160
222
|
});
|
|
161
223
|
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
|
-
}
|
|
224
|
+
await deletePatch(opts, this._context);
|
|
192
225
|
});
|
|
193
226
|
};
|
|
194
227
|
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":"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
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
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;AA4G7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA+IlG,CAAA"}
|
package/dist/esm/plugin.js
CHANGED
|
@@ -54,6 +54,40 @@ async function createPatch(opts, context, current) {
|
|
|
54
54
|
doc: current
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
+
async function deletePatch(opts, context) {
|
|
58
|
+
if (_.isEmpty(context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled))
|
|
59
|
+
return;
|
|
60
|
+
const chunks = _.chunk(context.deletedDocs, 1000);
|
|
61
|
+
for await (const chunk of chunks) {
|
|
62
|
+
const bulk = [];
|
|
63
|
+
for (const oldDoc of chunk) {
|
|
64
|
+
if (opts.eventDeleted) {
|
|
65
|
+
em.emit(opts.eventDeleted, { oldDoc });
|
|
66
|
+
}
|
|
67
|
+
if (!opts.patchHistoryDisabled) {
|
|
68
|
+
bulk.push({
|
|
69
|
+
insertOne: {
|
|
70
|
+
document: {
|
|
71
|
+
op: context.op,
|
|
72
|
+
modelName: context.modelName,
|
|
73
|
+
collectionName: context.collectionName,
|
|
74
|
+
collectionId: oldDoc._id,
|
|
75
|
+
doc: oldDoc,
|
|
76
|
+
version: 0
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!opts.patchHistoryDisabled) {
|
|
83
|
+
await History
|
|
84
|
+
.bulkWrite(bulk, { ordered: false })
|
|
85
|
+
.catch((err) => {
|
|
86
|
+
console.error(err);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
57
91
|
export const patchEventEmitter = em;
|
|
58
92
|
export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
59
93
|
schema.pre('save', async function (next) {
|
|
@@ -89,13 +123,12 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
89
123
|
const options = this.getOptions();
|
|
90
124
|
const count = await this.model.count(filter).exec();
|
|
91
125
|
const commands = [];
|
|
92
|
-
|
|
126
|
+
this._context = {
|
|
93
127
|
op: this.op,
|
|
94
128
|
modelName: opts.modelName ?? this.model.modelName,
|
|
95
129
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
96
130
|
isNew: options.upsert && count === 0
|
|
97
131
|
};
|
|
98
|
-
this._context = context;
|
|
99
132
|
try {
|
|
100
133
|
const keys = _.keys(update).filter((key) => key.startsWith('$'));
|
|
101
134
|
if (update && !_.isEmpty(keys)) {
|
|
@@ -115,7 +148,7 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
115
148
|
catch (error) {
|
|
116
149
|
}
|
|
117
150
|
});
|
|
118
|
-
await updatePatch(opts,
|
|
151
|
+
await updatePatch(opts, this._context, current, doc.toObject({ depopulate: true }));
|
|
119
152
|
});
|
|
120
153
|
next();
|
|
121
154
|
}
|
|
@@ -136,55 +169,55 @@ export const patchHistoryPlugin = function plugin(schema, opts) {
|
|
|
136
169
|
});
|
|
137
170
|
}
|
|
138
171
|
});
|
|
172
|
+
schema.pre('remove', async function (next) {
|
|
173
|
+
const original = this.toObject({ depopulate: true });
|
|
174
|
+
const model = this.constructor;
|
|
175
|
+
const context = {
|
|
176
|
+
op: 'delete',
|
|
177
|
+
modelName: opts.modelName ?? model.modelName,
|
|
178
|
+
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
179
|
+
};
|
|
180
|
+
try {
|
|
181
|
+
if (opts.eventDeleted) {
|
|
182
|
+
em.emit(opts.eventDeleted, { oldDoc: original });
|
|
183
|
+
}
|
|
184
|
+
await deletePatch(opts, context);
|
|
185
|
+
next();
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
next(error);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
139
191
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (next) {
|
|
140
192
|
const filter = this.getFilter();
|
|
141
193
|
const options = this.getOptions();
|
|
142
194
|
const ignore = options.__ignore;
|
|
143
|
-
|
|
195
|
+
if (ignore)
|
|
196
|
+
return next();
|
|
197
|
+
this._context = {
|
|
144
198
|
op: this.op,
|
|
145
199
|
modelName: opts.modelName ?? this.model.modelName,
|
|
146
200
|
collectionName: opts.collectionName ?? this.model.collection.collectionName
|
|
147
201
|
};
|
|
148
|
-
if (!
|
|
149
|
-
|
|
150
|
-
if (
|
|
151
|
-
|
|
202
|
+
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
203
|
+
const docs = await this.model.find(filter).exec();
|
|
204
|
+
if (!_.isEmpty(docs)) {
|
|
205
|
+
this._context.deletedDocs = docs;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const doc = await this.model.findOne(filter).exec();
|
|
210
|
+
if (!_.isEmpty(doc)) {
|
|
211
|
+
this._context.deletedDocs = [doc];
|
|
152
212
|
}
|
|
153
213
|
}
|
|
154
|
-
this._context
|
|
214
|
+
if (opts.preDeleteManyCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
|
|
215
|
+
await opts.preDeleteManyCallback(this._context.deletedDocs);
|
|
216
|
+
}
|
|
155
217
|
next();
|
|
156
218
|
});
|
|
157
219
|
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
|
-
}
|
|
220
|
+
await deletePatch(opts, this._context);
|
|
188
221
|
});
|
|
189
222
|
};
|
|
190
223
|
//# sourceMappingURL=plugin.js.map
|
package/dist/esm/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AA4G7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IA+IlG,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-patch-mongoose",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Patch history & events for mongoose models",
|
|
5
5
|
"author": "Alex Eagle",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
"emit",
|
|
32
32
|
"create",
|
|
33
33
|
"update",
|
|
34
|
-
"delete"
|
|
34
|
+
"delete",
|
|
35
|
+
"audit",
|
|
36
|
+
"log"
|
|
35
37
|
],
|
|
36
38
|
"engines": {
|
|
37
39
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
|
@@ -71,7 +73,7 @@
|
|
|
71
73
|
"devDependencies": {
|
|
72
74
|
"@shelf/jest-mongodb": "4.1.7",
|
|
73
75
|
"@swc/cli": "0.1.62",
|
|
74
|
-
"@swc/core": "1.3.
|
|
76
|
+
"@swc/core": "1.3.49",
|
|
75
77
|
"@swc/helpers": "0.5.0",
|
|
76
78
|
"@swc/jest": "0.2.24",
|
|
77
79
|
"@swc/register": "0.1.10",
|
package/src/plugin.ts
CHANGED
|
@@ -74,6 +74,42 @@ async function createPatch<T> (opts: IPluginOptions<T>, context: IContext<T>, cu
|
|
|
74
74
|
})
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
async function deletePatch<T> (opts: IPluginOptions<T>, context: IContext<T>): Promise<void> {
|
|
78
|
+
if (_.isEmpty(context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled)) return
|
|
79
|
+
|
|
80
|
+
const chunks = _.chunk(context.deletedDocs, 1000)
|
|
81
|
+
for await (const chunk of chunks) {
|
|
82
|
+
const bulk = []
|
|
83
|
+
for (const oldDoc of chunk) {
|
|
84
|
+
if (opts.eventDeleted) {
|
|
85
|
+
em.emit(opts.eventDeleted, { oldDoc })
|
|
86
|
+
}
|
|
87
|
+
if (!opts.patchHistoryDisabled) {
|
|
88
|
+
bulk.push({
|
|
89
|
+
insertOne: {
|
|
90
|
+
document: {
|
|
91
|
+
op: context.op,
|
|
92
|
+
modelName: context.modelName,
|
|
93
|
+
collectionName: context.collectionName,
|
|
94
|
+
collectionId: oldDoc._id as Types.ObjectId,
|
|
95
|
+
doc: oldDoc,
|
|
96
|
+
version: 0
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!opts.patchHistoryDisabled) {
|
|
104
|
+
await History
|
|
105
|
+
.bulkWrite(bulk, { ordered: false })
|
|
106
|
+
.catch((err: MongooseError) => {
|
|
107
|
+
console.error(err)
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
77
113
|
/**
|
|
78
114
|
* @description Patch patch event emitter
|
|
79
115
|
*/
|
|
@@ -122,15 +158,13 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
122
158
|
const count = await this.model.count(filter).exec()
|
|
123
159
|
const commands: Record<string, Partial<T>>[] = []
|
|
124
160
|
|
|
125
|
-
|
|
161
|
+
this._context = {
|
|
126
162
|
op: this.op,
|
|
127
163
|
modelName: opts.modelName ?? this.model.modelName,
|
|
128
164
|
collectionName: opts.collectionName ?? this.model.collection.collectionName,
|
|
129
165
|
isNew: options.upsert && count === 0
|
|
130
166
|
}
|
|
131
167
|
|
|
132
|
-
this._context = context
|
|
133
|
-
|
|
134
168
|
try {
|
|
135
169
|
const keys = _.keys(update).filter((key) => key.startsWith('$'))
|
|
136
170
|
if (update && !_.isEmpty(keys)) {
|
|
@@ -140,8 +174,8 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
140
174
|
delete update[key]
|
|
141
175
|
})
|
|
142
176
|
}
|
|
143
|
-
const cursor = this.model.find(filter).cursor()
|
|
144
|
-
await cursor.eachAsync(async (doc
|
|
177
|
+
const cursor = this.model.find<HydratedDocument<T>>(filter).cursor()
|
|
178
|
+
await cursor.eachAsync(async (doc) => {
|
|
145
179
|
let current = doc.toObject({ depopulate: true }) as HydratedDocument<T>
|
|
146
180
|
current = assign(current, update)
|
|
147
181
|
_.forEach(commands, (command) => {
|
|
@@ -151,7 +185,7 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
151
185
|
// we catch assign keys that are not implemented
|
|
152
186
|
}
|
|
153
187
|
})
|
|
154
|
-
await updatePatch(opts,
|
|
188
|
+
await updatePatch(opts, this._context, current, doc.toObject({ depopulate: true }) as HydratedDocument<T>)
|
|
155
189
|
})
|
|
156
190
|
next()
|
|
157
191
|
} catch (error) {
|
|
@@ -163,8 +197,8 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
163
197
|
const update = this.getUpdate()
|
|
164
198
|
|
|
165
199
|
if (update && this._context.isNew) {
|
|
166
|
-
const cursor = this.model.findOne(update).cursor()
|
|
167
|
-
await cursor.eachAsync(async (doc
|
|
200
|
+
const cursor = this.model.findOne<HydratedDocument<T>>(update).cursor()
|
|
201
|
+
await cursor.eachAsync(async (doc) => {
|
|
168
202
|
const current = doc.toObject({ depopulate: true }) as HydratedDocument<T>
|
|
169
203
|
if (opts.eventCreated) {
|
|
170
204
|
em.emit(opts.eventCreated, { doc: current })
|
|
@@ -174,59 +208,60 @@ export const patchHistoryPlugin = function plugin<T> (schema: Schema<T>, opts: I
|
|
|
174
208
|
}
|
|
175
209
|
})
|
|
176
210
|
|
|
211
|
+
schema.pre('remove', async function (this: HydratedDocument<T>, next) {
|
|
212
|
+
const original = this.toObject({ depopulate: true })
|
|
213
|
+
const model = this.constructor as Model<T>
|
|
214
|
+
|
|
215
|
+
const context: IContext<T> = {
|
|
216
|
+
op: 'delete',
|
|
217
|
+
modelName: opts.modelName ?? model.modelName,
|
|
218
|
+
collectionName: opts.collectionName ?? model.collection.collectionName
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
try {
|
|
222
|
+
if (opts.eventDeleted) {
|
|
223
|
+
em.emit(opts.eventDeleted, { oldDoc: original })
|
|
224
|
+
}
|
|
225
|
+
await deletePatch(opts, context)
|
|
226
|
+
next()
|
|
227
|
+
} catch (error) {
|
|
228
|
+
next(error as CallbackError)
|
|
229
|
+
}
|
|
230
|
+
})
|
|
231
|
+
|
|
177
232
|
schema.pre(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (this: IHookContext<T>, next) {
|
|
178
233
|
const filter = this.getFilter()
|
|
179
234
|
const options = this.getOptions()
|
|
180
235
|
const ignore = options.__ignore as boolean
|
|
181
236
|
|
|
182
|
-
|
|
237
|
+
if (ignore) return next()
|
|
238
|
+
|
|
239
|
+
this._context = {
|
|
183
240
|
op: this.op,
|
|
184
241
|
modelName: opts.modelName ?? this.model.modelName,
|
|
185
242
|
collectionName: opts.collectionName ?? this.model.collection.collectionName
|
|
186
243
|
}
|
|
187
244
|
|
|
188
|
-
if (!
|
|
189
|
-
|
|
190
|
-
if (
|
|
191
|
-
|
|
245
|
+
if (['remove', 'deleteMany'].includes(this._context.op) && !options.single) {
|
|
246
|
+
const docs = await this.model.find<HydratedDocument<T>>(filter).exec()
|
|
247
|
+
if (!_.isEmpty(docs)) {
|
|
248
|
+
this._context.deletedDocs = docs
|
|
249
|
+
}
|
|
250
|
+
} else {
|
|
251
|
+
const doc = await this.model.findOne<HydratedDocument<T>>(filter).exec()
|
|
252
|
+
if (!_.isEmpty(doc)) {
|
|
253
|
+
this._context.deletedDocs = [doc]
|
|
192
254
|
}
|
|
193
255
|
}
|
|
194
256
|
|
|
195
|
-
this._context
|
|
257
|
+
if (opts.preDeleteManyCallback && _.isArray(this._context.deletedDocs) && !_.isEmpty(this._context.deletedDocs)) {
|
|
258
|
+
await opts.preDeleteManyCallback(this._context.deletedDocs)
|
|
259
|
+
}
|
|
260
|
+
|
|
196
261
|
next()
|
|
197
262
|
})
|
|
198
263
|
|
|
199
264
|
schema.post(['remove', 'findOneAndDelete', 'findOneAndRemove', 'deleteOne', 'deleteMany'], options, async function (this: IHookContext<T>) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const chunks = _.chunk(this._context.deletedDocs, 1000)
|
|
203
|
-
for await (const chunk of chunks) {
|
|
204
|
-
const bulk = []
|
|
205
|
-
for (const oldDoc of chunk) {
|
|
206
|
-
if (opts.eventDeleted) {
|
|
207
|
-
em.emit(opts.eventDeleted, { oldDoc })
|
|
208
|
-
}
|
|
209
|
-
if (!opts.patchHistoryDisabled) {
|
|
210
|
-
bulk.push({
|
|
211
|
-
insertOne: {
|
|
212
|
-
document: {
|
|
213
|
-
op: this._context.op,
|
|
214
|
-
modelName: this._context.modelName,
|
|
215
|
-
collectionName: this._context.collectionName,
|
|
216
|
-
collectionId: oldDoc._id as Types.ObjectId,
|
|
217
|
-
doc: oldDoc,
|
|
218
|
-
version: 0
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
})
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (!opts.patchHistoryDisabled) {
|
|
226
|
-
await History.bulkWrite(bulk, { ordered: false }).catch((err: MongooseError) => {
|
|
227
|
-
console.error(err)
|
|
228
|
-
})
|
|
229
|
-
}
|
|
230
|
-
}
|
|
265
|
+
await deletePatch(opts, this._context)
|
|
231
266
|
})
|
|
232
267
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export const
|
|
2
|
-
export const
|
|
3
|
-
export const
|
|
1
|
+
export const USER_CREATED = 'user-created'
|
|
2
|
+
export const USER_UPDATED = 'user-updated'
|
|
3
|
+
export const USER_DELETED = 'user-deleted'
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
|
|
2
|
+
import mongoose, { model } from 'mongoose'
|
|
3
|
+
|
|
4
|
+
import UserSchema from './schemas/UserSchema'
|
|
5
|
+
import { patchHistoryPlugin } from '../src/plugin'
|
|
6
|
+
import History from '../src/models/History'
|
|
7
|
+
|
|
8
|
+
import em from '../src/em'
|
|
9
|
+
import { USER_DELETED } from './constants/events'
|
|
10
|
+
|
|
11
|
+
jest.mock('../src/em', () => {
|
|
12
|
+
return {
|
|
13
|
+
emit: jest.fn()
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
describe('plugin - patch history disabled', () => {
|
|
18
|
+
const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
|
|
19
|
+
|
|
20
|
+
UserSchema.plugin(patchHistoryPlugin, {
|
|
21
|
+
eventDeleted: USER_DELETED,
|
|
22
|
+
patchHistoryDisabled: true
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const User = model('User', UserSchema)
|
|
26
|
+
|
|
27
|
+
beforeAll(async () => {
|
|
28
|
+
await mongoose.connect(uri)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
afterAll(async () => {
|
|
32
|
+
await mongoose.connection.close()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
beforeEach(async () => {
|
|
36
|
+
await mongoose.connection.collection('users').deleteMany({})
|
|
37
|
+
await mongoose.connection.collection('history').deleteMany({})
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
it('should deleteMany and emit two delete events', async () => {
|
|
41
|
+
const users = await User.create([
|
|
42
|
+
{ name: 'John', role: 'user' },
|
|
43
|
+
{ name: 'Alice', role: 'user' },
|
|
44
|
+
{ name: 'Bob', role: 'admin' }
|
|
45
|
+
])
|
|
46
|
+
|
|
47
|
+
const [john, alice] = users
|
|
48
|
+
|
|
49
|
+
await User.deleteMany({ role: 'user' }).exec()
|
|
50
|
+
|
|
51
|
+
const history = await History.find({})
|
|
52
|
+
expect(history).toHaveLength(0)
|
|
53
|
+
|
|
54
|
+
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
55
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
56
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
57
|
+
})
|
|
58
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
59
|
+
oldDoc: expect.objectContaining(alice.toObject({ depopulate: true }))
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('should deleteMany and emit one delete event { single: true }', async () => {
|
|
64
|
+
const users = await User.create([
|
|
65
|
+
{ name: 'John', role: 'user' },
|
|
66
|
+
{ name: 'Alice', role: 'user' },
|
|
67
|
+
{ name: 'Bob', role: 'admin' }
|
|
68
|
+
])
|
|
69
|
+
|
|
70
|
+
const [john] = users
|
|
71
|
+
|
|
72
|
+
await User.deleteMany({ role: 'user' }, { single: true }).exec()
|
|
73
|
+
|
|
74
|
+
const history = await History.find({})
|
|
75
|
+
expect(history).toHaveLength(0)
|
|
76
|
+
|
|
77
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
78
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
79
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
80
|
+
})
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('should deleteOne and emit one delete event', async () => {
|
|
84
|
+
const users = await User.create([
|
|
85
|
+
{ name: 'John', role: 'user' },
|
|
86
|
+
{ name: 'Alice', role: 'user' },
|
|
87
|
+
{ name: 'Bob', role: 'admin' }
|
|
88
|
+
])
|
|
89
|
+
|
|
90
|
+
const [john] = users
|
|
91
|
+
|
|
92
|
+
await User.deleteOne({ role: 'user' }).exec()
|
|
93
|
+
|
|
94
|
+
const history = await History.find({})
|
|
95
|
+
expect(history).toHaveLength(0)
|
|
96
|
+
|
|
97
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
98
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
99
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it('should findByIdAndDelete and emit one delete event', async () => {
|
|
104
|
+
const users = await User.create([
|
|
105
|
+
{ name: 'John', role: 'user' },
|
|
106
|
+
{ name: 'Alice', role: 'user' },
|
|
107
|
+
{ name: 'Bob', role: 'admin' }
|
|
108
|
+
])
|
|
109
|
+
|
|
110
|
+
const [john] = users
|
|
111
|
+
|
|
112
|
+
await User.findByIdAndDelete(john._id).exec()
|
|
113
|
+
|
|
114
|
+
const history = await History.find({})
|
|
115
|
+
expect(history).toHaveLength(0)
|
|
116
|
+
|
|
117
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
118
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
119
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
120
|
+
})
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
it('should findByIdAndRemove and emit one delete event', async () => {
|
|
124
|
+
const users = await User.create([
|
|
125
|
+
{ name: 'John', role: 'user' },
|
|
126
|
+
{ name: 'Alice', role: 'user' },
|
|
127
|
+
{ name: 'Bob', role: 'admin' }
|
|
128
|
+
])
|
|
129
|
+
|
|
130
|
+
const [john] = users
|
|
131
|
+
|
|
132
|
+
await User.findByIdAndRemove(john._id).exec()
|
|
133
|
+
|
|
134
|
+
const history = await History.find({})
|
|
135
|
+
expect(history).toHaveLength(0)
|
|
136
|
+
|
|
137
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
138
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
139
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
it('should findOneAndDelete and emit one delete event', async () => {
|
|
144
|
+
const users = await User.create([
|
|
145
|
+
{ name: 'John', role: 'user' },
|
|
146
|
+
{ name: 'Alice', role: 'user' },
|
|
147
|
+
{ name: 'Bob', role: 'admin' }
|
|
148
|
+
])
|
|
149
|
+
|
|
150
|
+
const [john] = users
|
|
151
|
+
|
|
152
|
+
await User.findOneAndDelete({ role: 'user' }).exec()
|
|
153
|
+
|
|
154
|
+
const history = await History.find({})
|
|
155
|
+
expect(history).toHaveLength(0)
|
|
156
|
+
|
|
157
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
158
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
159
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
160
|
+
})
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
it('should findOneAndRemove and emit one delete event', async () => {
|
|
164
|
+
const users = await User.create([
|
|
165
|
+
{ name: 'John', role: 'user' },
|
|
166
|
+
{ name: 'Alice', role: 'user' },
|
|
167
|
+
{ name: 'Bob', role: 'admin' }
|
|
168
|
+
])
|
|
169
|
+
|
|
170
|
+
const [john] = users
|
|
171
|
+
|
|
172
|
+
await User.findOneAndRemove({ role: 'user' }).exec()
|
|
173
|
+
|
|
174
|
+
const history = await History.find({})
|
|
175
|
+
expect(history).toHaveLength(0)
|
|
176
|
+
|
|
177
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
178
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
179
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
it('should remove and emit two delete events', async () => {
|
|
184
|
+
const users = await User.create([
|
|
185
|
+
{ name: 'John', role: 'user' },
|
|
186
|
+
{ name: 'Alice', role: 'user' },
|
|
187
|
+
{ name: 'Bob', role: 'admin' }
|
|
188
|
+
])
|
|
189
|
+
|
|
190
|
+
const [john, alice] = users
|
|
191
|
+
|
|
192
|
+
await User.remove({ role: 'user' }).exec()
|
|
193
|
+
|
|
194
|
+
const remaining = await User.find({})
|
|
195
|
+
|
|
196
|
+
expect(remaining).toHaveLength(1)
|
|
197
|
+
|
|
198
|
+
const history = await History.find({})
|
|
199
|
+
expect(history).toHaveLength(0)
|
|
200
|
+
|
|
201
|
+
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
202
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
203
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
204
|
+
})
|
|
205
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
206
|
+
oldDoc: expect.objectContaining(alice.toObject({ depopulate: true }))
|
|
207
|
+
})
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
it('should remove and emit one delete event { single: true }', async () => {
|
|
211
|
+
const users = await User.create([
|
|
212
|
+
{ name: 'John', role: 'user' },
|
|
213
|
+
{ name: 'Alice', role: 'user' },
|
|
214
|
+
{ name: 'Bob', role: 'admin' }
|
|
215
|
+
])
|
|
216
|
+
|
|
217
|
+
const [john] = users
|
|
218
|
+
|
|
219
|
+
await User.remove({ role: 'user' }, { single: true }).exec()
|
|
220
|
+
|
|
221
|
+
const history = await History.find({})
|
|
222
|
+
expect(history).toHaveLength(0)
|
|
223
|
+
|
|
224
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
225
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
226
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
227
|
+
})
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
it('should create then delete and emit one delete event', async () => {
|
|
231
|
+
const john = await User.create({ name: 'John', role: 'user' })
|
|
232
|
+
await john.delete()
|
|
233
|
+
|
|
234
|
+
const history = await History.find({})
|
|
235
|
+
expect(history).toHaveLength(0)
|
|
236
|
+
|
|
237
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
238
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
239
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
|
|
243
|
+
it('should create then remove and emit one delete event', async () => {
|
|
244
|
+
const john = await User.create({ name: 'John', role: 'user' })
|
|
245
|
+
await john.remove()
|
|
246
|
+
|
|
247
|
+
const history = await History.find({})
|
|
248
|
+
expect(history).toHaveLength(0)
|
|
249
|
+
|
|
250
|
+
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
251
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
252
|
+
oldDoc: expect.objectContaining(john.toObject({ depopulate: true }))
|
|
253
|
+
})
|
|
254
|
+
})
|
|
255
|
+
})
|
package/tests/plugin.test.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { patchHistoryPlugin } from '../src/plugin'
|
|
|
5
5
|
import History from '../src/models/History'
|
|
6
6
|
|
|
7
7
|
import em from '../src/em'
|
|
8
|
-
import {
|
|
8
|
+
import { USER_CREATED, USER_UPDATED, USER_DELETED } from './constants/events'
|
|
9
9
|
|
|
10
10
|
jest.mock('../src/em', () => {
|
|
11
11
|
return { emit: jest.fn() }
|
|
@@ -15,9 +15,9 @@ describe('plugin', () => {
|
|
|
15
15
|
const uri = `${globalThis.__MONGO_URI__}${globalThis.__MONGO_DB_NAME__}`
|
|
16
16
|
|
|
17
17
|
UserSchema.plugin(patchHistoryPlugin, {
|
|
18
|
-
eventCreated:
|
|
19
|
-
eventUpdated:
|
|
20
|
-
eventDeleted:
|
|
18
|
+
eventCreated: USER_CREATED,
|
|
19
|
+
eventUpdated: USER_UPDATED,
|
|
20
|
+
eventDeleted: USER_DELETED,
|
|
21
21
|
omit: ['__v', 'role', 'createdAt', 'updatedAt']
|
|
22
22
|
})
|
|
23
23
|
|
|
@@ -114,18 +114,18 @@ describe('plugin', () => {
|
|
|
114
114
|
expect(fourth.patch).toHaveLength(0)
|
|
115
115
|
|
|
116
116
|
expect(em.emit).toHaveBeenCalledTimes(4)
|
|
117
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
118
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
117
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
118
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
119
119
|
oldDoc: expect.objectContaining({ _id: user._id, name: 'John', role: 'user' }),
|
|
120
120
|
doc: expect.objectContaining({ _id: user._id, name: 'Alice', role: 'user' }),
|
|
121
121
|
patch: second.patch
|
|
122
122
|
})
|
|
123
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
123
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
124
124
|
oldDoc: expect.objectContaining({ _id: user._id, name: 'Alice', role: 'user' }),
|
|
125
125
|
doc: expect.objectContaining({ _id: user._id, name: 'Bob', role: 'user' }),
|
|
126
126
|
patch: third.patch
|
|
127
127
|
})
|
|
128
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
128
|
+
expect(em.emit).toHaveBeenCalledWith(USER_DELETED, {
|
|
129
129
|
oldDoc: expect.objectContaining({ _id: user._id, name: 'Bob', role: 'user' })
|
|
130
130
|
})
|
|
131
131
|
})
|
|
@@ -158,7 +158,7 @@ describe('plugin', () => {
|
|
|
158
158
|
expect(first.patch).toHaveLength(0)
|
|
159
159
|
|
|
160
160
|
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
161
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
161
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
162
162
|
// no update event emitted because role is omitted
|
|
163
163
|
})
|
|
164
164
|
|
|
@@ -204,8 +204,8 @@ describe('plugin', () => {
|
|
|
204
204
|
])
|
|
205
205
|
|
|
206
206
|
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
207
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
208
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
207
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
208
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
209
209
|
oldDoc: expect.objectContaining({ _id: user._id, name: 'John', role: 'user' }),
|
|
210
210
|
doc: expect.objectContaining({ _id: user._id, name: 'Alice', role: 'user' }),
|
|
211
211
|
patch: second.patch
|
|
@@ -254,8 +254,8 @@ describe('plugin', () => {
|
|
|
254
254
|
])
|
|
255
255
|
|
|
256
256
|
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
257
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
258
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
257
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
258
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
259
259
|
oldDoc: expect.objectContaining({ _id: user._id, name: 'John', role: 'user' }),
|
|
260
260
|
doc: expect.objectContaining({ _id: user._id, name: 'Alice', role: 'user' }),
|
|
261
261
|
patch: second.patch
|
|
@@ -304,8 +304,8 @@ describe('plugin', () => {
|
|
|
304
304
|
])
|
|
305
305
|
|
|
306
306
|
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
307
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
308
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
307
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
308
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
309
309
|
oldDoc: expect.objectContaining({ _id: user._id, name: 'John', role: 'user' }),
|
|
310
310
|
doc: expect.objectContaining({ _id: user._id, name: 'Alice', role: 'user' }),
|
|
311
311
|
patch: second.patch
|
|
@@ -386,14 +386,14 @@ describe('plugin', () => {
|
|
|
386
386
|
])
|
|
387
387
|
|
|
388
388
|
expect(em.emit).toHaveBeenCalledTimes(4)
|
|
389
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
390
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
391
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
389
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
390
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: second.doc })
|
|
391
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
392
392
|
oldDoc: expect.objectContaining({ _id: john._id, name: 'John', role: 'user' }),
|
|
393
393
|
doc: expect.objectContaining({ _id: john._id, name: 'Bob', role: 'user' }),
|
|
394
394
|
patch: third.patch
|
|
395
395
|
})
|
|
396
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
396
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
397
397
|
oldDoc: expect.objectContaining({ _id: alice._id, name: 'Alice', role: 'user' }),
|
|
398
398
|
doc: expect.objectContaining({ _id: alice._id, name: 'Bob', role: 'user' }),
|
|
399
399
|
patch: fourth.patch
|
|
@@ -440,8 +440,8 @@ describe('plugin', () => {
|
|
|
440
440
|
expect(second.patch).toHaveLength(0)
|
|
441
441
|
|
|
442
442
|
expect(em.emit).toHaveBeenCalledTimes(2)
|
|
443
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
444
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
443
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
444
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: second.doc })
|
|
445
445
|
})
|
|
446
446
|
|
|
447
447
|
it('should findOneAndUpdate upsert', async () => {
|
|
@@ -472,7 +472,7 @@ describe('plugin', () => {
|
|
|
472
472
|
expect(first.patch).toHaveLength(0)
|
|
473
473
|
|
|
474
474
|
expect(em.emit).toHaveBeenCalledTimes(1)
|
|
475
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
475
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
476
476
|
// updated event is not emitted because it's an upsert
|
|
477
477
|
})
|
|
478
478
|
|
|
@@ -551,14 +551,14 @@ describe('plugin', () => {
|
|
|
551
551
|
])
|
|
552
552
|
|
|
553
553
|
expect(em.emit).toHaveBeenCalledTimes(4)
|
|
554
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
555
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
556
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
554
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: first.doc })
|
|
555
|
+
expect(em.emit).toHaveBeenCalledWith(USER_CREATED, { doc: second.doc })
|
|
556
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
557
557
|
oldDoc: expect.objectContaining({ _id: john._id, name: 'John', role: 'user' }),
|
|
558
558
|
doc: expect.objectContaining({ _id: john._id, name: 'Bob', role: 'user' }),
|
|
559
559
|
patch: third.patch
|
|
560
560
|
})
|
|
561
|
-
expect(em.emit).toHaveBeenCalledWith(
|
|
561
|
+
expect(em.emit).toHaveBeenCalledWith(USER_UPDATED, {
|
|
562
562
|
oldDoc: expect.objectContaining({ _id: alice._id, name: 'Alice', role: 'user' }),
|
|
563
563
|
doc: expect.objectContaining({ _id: alice._id, name: 'Bob', role: 'user' }),
|
|
564
564
|
patch: fourth.patch
|