ts-patch-mongoose 1.0.6 → 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 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
- console.log('User created', doc)
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
- console.log('User updated', doc, oldDoc, patch)
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, ({ doc }) => {
125
- console.log('User deleted', doc)
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 +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;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAgJlG,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"}
@@ -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
- const context = {
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, context, current, doc.toObject({ depopulate: true }));
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
- const context = {
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 (!ignore) {
153
- context.deletedDocs = await this.model.find(filter).exec();
154
- if (opts.preDeleteManyCallback) {
155
- await opts.preDeleteManyCallback(context.deletedDocs);
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 = 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
- if (lodash_1.default.isEmpty(this._context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled))
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;
@@ -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;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAgJlG,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"}
@@ -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
- const context = {
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, context, current, doc.toObject({ depopulate: true }));
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
- const context = {
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 (!ignore) {
149
- context.deletedDocs = await this.model.find(filter).exec();
150
- if (opts.preDeleteManyCallback) {
151
- await opts.preDeleteManyCallback(context.deletedDocs);
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 = 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
- if (_.isEmpty(this._context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled))
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
@@ -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":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAA;AACtB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAQrC,OAAO,EAAE,MAAM,MAAM,CAAA;AACrB,OAAO,OAAO,MAAM,kBAAkB,CAAA;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,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,cAAc,GAAG,IAAI,CAAC,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,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAM;IAEjE,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;IAEpE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAM;IAE5B,IAAI,IAAI,CAAC,YAAY,EAAE;QACrB,EAAE,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,OAAO,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,OAAO,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,WAAW,CAAK,IAAuB,EAAE,OAAoB,EAAE,OAA4B;IACxG,IAAI,IAAI,CAAC,oBAAoB;QAAE,OAAM;IAErC,MAAM,OAAO,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,YAAY,EAAE,OAAO,CAAC,GAAqB;QAC3C,GAAG,EAAE,OAAO;KACb,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAK,IAAuB,EAAE,OAAoB;IAC1E,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,oBAAoB,CAAC;QAAE,OAAM;IAE/F,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACjD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE;QAChC,MAAM,IAAI,GAAG,EAAE,CAAA;QACf,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;YAC1B,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;aACvC;YACD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;gBAC9B,IAAI,CAAC,IAAI,CAAC;oBACR,SAAS,EAAE;wBACT,QAAQ,EAAE;4BACR,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,SAAS,EAAE,OAAO,CAAC,SAAS;4BAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,YAAY,EAAE,MAAM,CAAC,GAAqB;4BAC1C,GAAG,EAAE,MAAM;4BACX,OAAO,EAAE,CAAC;yBACX;qBACF;iBACF,CAAC,CAAA;aACH;SACF;QAED,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,MAAM,OAAO;iBACV,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;iBACnC,KAAK,CAAC,CAAC,GAAkB,EAAE,EAAE;gBAC5B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpB,CAAC,CAAC,CAAA;SACL;KACF;AACH,CAAC;AAKD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAQnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,MAAM,CAAK,MAAiB,EAAE,IAAuB;IAC9F,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,WAAW,IAAI;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAwB,CAAA;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAuB,CAAA;QAE1C,MAAM,OAAO,GAAgB;YAC3B,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACpC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;YAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc;SACvE,CAAA;QAED,IAAI;YACF,IAAI,IAAI,CAAC,KAAK,EAAE;gBACd,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;iBAC7C;gBACD,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;aAC1C;iBAAM;gBACL,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;gBACzD,IAAI,QAAQ,EAAE;oBACZ,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;iBACpD;aACF;YACD,IAAI,EAAE,CAAA;SACP;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,KAAsB,CAAC,CAAA;SAC7B;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,KAAK,WAAkC,IAAI;QAC/G,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAuC,CAAA;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;QACnD,MAAM,QAAQ,GAAiC,EAAE,CAAA;QAEjD,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YACjD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc;YAC3E,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK,KAAK,CAAC;SACrC,CAAA;QAED,IAAI;YACF,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;YAChE,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC9B,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;oBACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAErC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAA;gBACpB,CAAC,CAAC,CAAA;aACH;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;YACpE,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACnC,IAAI,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAwB,CAAA;gBACvE,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBACjC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;oBAC9B,IAAI;wBACF,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;qBACnC;oBAAC,OAAO,KAAK,EAAE;qBAEf;gBACH,CAAC,CAAC,CAAA;gBACF,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAwB,CAAC,CAAA;YAC5G,CAAC,CAAC,CAAA;YACF,IAAI,EAAE,CAAA;SACP;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,KAAsB,CAAC,CAAA;SAC7B;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,KAAK;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAE/B,IAAI,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;YACvE,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACnC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAwB,CAAA;gBACzE,IAAI,IAAI,CAAC,YAAY,EAAE;oBACrB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;iBAC7C;gBACD,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YACjD,CAAC,CAAC,CAAA;SACH;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,WAAsC,IAAI;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAuB,CAAA;QAE1C,MAAM,OAAO,GAAgB;YAC3B,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;YAC5C,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc;SACvE,CAAA;QAED,IAAI;YACF,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAA;aACjD;YACD,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAChC,IAAI,EAAE,CAAA;SACP;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,KAAsB,CAAC,CAAA;SAC7B;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,WAAkC,IAAI;QAC5I,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAmB,CAAA;QAE1C,IAAI,MAAM;YAAE,OAAO,IAAI,EAAE,CAAA;QAEzB,IAAI,CAAC,QAAQ,GAAG;YACd,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS;YACjD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc;SAC5E,CAAA;QAED,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAC1E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAsB,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;YACtE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAA;aACjC;SACF;aAAM;YACL,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;YACxE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACnB,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,CAAA;aAClC;SACF;QAED,IAAI,IAAI,CAAC,qBAAqB,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;YAC/G,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;SAC5D;QAED,IAAI,EAAE,CAAA;IACR,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK;QACvG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -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;AAwE7D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;CAAK,CAAA;AAQnC,eAAO,MAAM,kBAAkB,oOAAoE,IAgJlG,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.6",
3
+ "version": "1.0.7",
4
4
  "description": "Patch history & events for mongoose models",
5
5
  "author": "Alex Eagle",
6
6
  "license": "MIT",
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
- const context: IContext<T> = {
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: HydratedDocument<T>) => {
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, context, current, doc.toObject({ depopulate: true }) as HydratedDocument<T>)
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: HydratedDocument<T>) => {
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
- const context: IContext<T> = {
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 (!ignore) {
189
- context.deletedDocs = await this.model.find(filter).exec()
190
- if (opts.preDeleteManyCallback) {
191
- await opts.preDeleteManyCallback(context.deletedDocs)
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 = 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
- if (_.isEmpty(this._context.deletedDocs) || (!opts.eventDeleted && opts.patchHistoryDisabled)) return
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 USER_CREATED_EVENT = 'testCreated'
2
- export const USER_UPDATED_EVENT = 'testUpdated'
3
- export const USER_DELETED_EVENT = 'testDeleted'
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
+ })
@@ -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 { USER_CREATED_EVENT, USER_UPDATED_EVENT, USER_DELETED_EVENT } from './constants/events'
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: USER_CREATED_EVENT,
19
- eventUpdated: USER_UPDATED_EVENT,
20
- eventDeleted: USER_DELETED_EVENT,
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(USER_CREATED_EVENT, { doc: first.doc })
118
- expect(em.emit).toHaveBeenCalledWith(USER_UPDATED_EVENT, {
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(USER_UPDATED_EVENT, {
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(USER_DELETED_EVENT, {
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(USER_CREATED_EVENT, { doc: first.doc })
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(USER_CREATED_EVENT, { doc: first.doc })
208
- expect(em.emit).toHaveBeenCalledWith(USER_UPDATED_EVENT, {
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(USER_CREATED_EVENT, { doc: first.doc })
258
- expect(em.emit).toHaveBeenCalledWith(USER_UPDATED_EVENT, {
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(USER_CREATED_EVENT, { doc: first.doc })
308
- expect(em.emit).toHaveBeenCalledWith(USER_UPDATED_EVENT, {
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(USER_CREATED_EVENT, { doc: first.doc })
390
- expect(em.emit).toHaveBeenCalledWith(USER_CREATED_EVENT, { doc: second.doc })
391
- expect(em.emit).toHaveBeenCalledWith(USER_UPDATED_EVENT, {
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(USER_UPDATED_EVENT, {
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(USER_CREATED_EVENT, { doc: first.doc })
444
- expect(em.emit).toHaveBeenCalledWith(USER_CREATED_EVENT, { doc: second.doc })
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(USER_CREATED_EVENT, { doc: first.doc })
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(USER_CREATED_EVENT, { doc: first.doc })
555
- expect(em.emit).toHaveBeenCalledWith(USER_CREATED_EVENT, { doc: second.doc })
556
- expect(em.emit).toHaveBeenCalledWith(USER_UPDATED_EVENT, {
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(USER_UPDATED_EVENT, {
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