Skip to content

Commit a320f58

Browse files
committed
Enhance event handling in AbstractServiceSchema with before and after event names for improved logging and extensibility
1 parent 714d42f commit a320f58

File tree

1 file changed

+49
-32
lines changed

1 file changed

+49
-32
lines changed

src/_common/abstracts/abstract.service.schema.ts

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { ServiceSchemaInterface } from './interfaces/service.schema.interface';
1818
import { AbstractSchema } from './schemas/abstract.schema';
1919
import mongodb from 'mongodb';
2020
import { omit } from 'radash';
21+
import { cp } from 'fs';
2122

2223
@Injectable()
2324
export abstract class AbstractServiceSchema extends AbstractService implements ServiceSchemaInterface {
@@ -38,9 +39,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
3839
options?: QueryOptions<T> | null | undefined,
3940
): Promise<Query<Array<T>, T, any, T>[]> {
4041
if (this.eventEmitter) {
42+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFind'].join(EventEmitterSeparator)
4143
const beforeEvents = await this.eventEmitter?.emitAsync(
42-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFind'].join(EventEmitterSeparator),
43-
{ filter, projection, options },
44+
eventName,
45+
{ filter, projection, options, eventName },
4446
)
4547
for (const beforeEvent of beforeEvents) {
4648
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -55,9 +57,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
5557

5658
public async count<T extends AbstractSchema | Document>(filter?: FilterQuery<T>, options?: (mongodb.CountOptions & MongooseBaseQueryOptions<T>) | null): Promise<number> {
5759
if (this.eventEmitter) {
60+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeCount'].join(EventEmitterSeparator)
5861
const beforeEvents = await this.eventEmitter?.emitAsync(
59-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeCount'].join(EventEmitterSeparator),
60-
{ filter, options },
62+
eventName,
63+
{ filter, options, eventName },
6164
)
6265
for (const beforeEvent of beforeEvents) {
6366
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -85,9 +88,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
8588
): Promise<[Array<T & Query<T, T, any, T>>, number]> {
8689
this.logger.debug(['findAndCount', JSON.stringify(Object.values(arguments))].join(' '))
8790
if (this.eventEmitter) {
91+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFindAndCount'].join(EventEmitterSeparator)
8892
const beforeEvents = await this.eventEmitter?.emitAsync(
89-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFindAndCount'].join(EventEmitterSeparator),
90-
{ filter, projection, options },
93+
beforeEventName,
94+
{ filter, projection, options, eventName: beforeEventName },
9195
)
9296
for (const beforeEvent of beforeEvents) {
9397
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -102,9 +106,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
102106
let data = await this._model.find<T & Query<T, T, any, T>>(filter, projection, options).exec()
103107

104108
if (this.eventEmitter) {
109+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterFindAndCount'].join(EventEmitterSeparator)
105110
const afterEvents = await this.eventEmitter?.emitAsync(
106-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterFindAndCount'].join(EventEmitterSeparator),
107-
{ data, count },
111+
eventName,
112+
{ data, count, eventName },
108113
)
109114
for (const afterEvent of afterEvents) {
110115
if (afterEvent?.data) data = { ...data, ...afterEvent.data }
@@ -123,9 +128,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
123128
this.logger.debug(['findById', JSON.stringify(Object.values(arguments))].join(' '))
124129

125130
if (this.eventEmitter) {
131+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFindById'].join(EventEmitterSeparator)
126132
const beforeEvents = await this.eventEmitter?.emitAsync(
127-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFindById'].join(EventEmitterSeparator),
128-
{ _id, projection, options },
133+
beforeEventName,
134+
{ _id, projection, options, eventName: beforeEventName },
129135
)
130136
for (const beforeEvent of beforeEvents) {
131137
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -137,9 +143,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
137143
let data = await this._model.findById<Query<T | null, T, any, T>>(_id, projection, options).exec()
138144

139145
if (this.eventEmitter) {
146+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterFindById'].join(EventEmitterSeparator)
140147
const afterEvents = await this.eventEmitter?.emitAsync(
141-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterFindById'].join(EventEmitterSeparator),
142-
{ data },
148+
eventName,
149+
{ data, eventName },
143150
)
144151
for (const afterEvent of afterEvents) {
145152
if (afterEvent?.data) data = { ...data, ...afterEvent.data }
@@ -160,9 +167,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
160167
): Promise<Query<T, T, any, T>> {
161168
this.logger.debug(['findOne', JSON.stringify(Object.values(arguments))].join(' '))
162169
if (this.eventEmitter) {
170+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFindOne'].join(EventEmitterSeparator)
163171
const beforeEvents = await this.eventEmitter?.emitAsync(
164-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeFindOne'].join(EventEmitterSeparator),
165-
{ filter, projection, options },
172+
beforeEventName,
173+
{ filter, projection, options, eventName: beforeEventName },
166174
)
167175
for (const beforeEvent of beforeEvents) {
168176
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -177,9 +185,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
177185
throw new NotFoundException()
178186
}
179187
if (this.eventEmitter) {
188+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterFindOne'].join(EventEmitterSeparator)
180189
const afterEvents = await this.eventEmitter?.emitAsync(
181-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterFindOne'].join(EventEmitterSeparator),
182-
{ data },
190+
eventName,
191+
{ data, eventName },
183192
)
184193
for (const afterEvent of afterEvents) {
185194
if (afterEvent?.data) data = { ...data, ...afterEvent.data }
@@ -198,9 +207,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
198207
})
199208
this.logger.debug(['create', JSON.stringify(logInfos)].join(' '))
200209
if (this.eventEmitter) {
210+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeCreate'].join(EventEmitterSeparator)
201211
const beforeEvents = await this.eventEmitter?.emitAsync(
202-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeCreate'].join(EventEmitterSeparator),
203-
{ data, options },
212+
beforeEventName,
213+
{ data, options, eventName: beforeEventName },
204214
)
205215
for (const beforeEvent of beforeEvents) {
206216
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -219,9 +229,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
219229
})
220230
let created = document.save(options)
221231
if (this.eventEmitter) {
232+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterCreate'].join(EventEmitterSeparator)
222233
const afterEvents = await this.eventEmitter?.emitAsync(
223-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterCreate'].join(EventEmitterSeparator),
224-
{ created },
234+
eventName,
235+
{ created, eventName },
225236
)
226237
for (const afterEvent of afterEvents) {
227238
if (afterEvent?.created) created = { ...created, ...afterEvent.created }
@@ -244,9 +255,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
244255
})
245256
this.logger.debug(['update', JSON.stringify(logInfos)].join(' '))
246257
if (this.eventEmitter) {
258+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeUpdate'].join(EventEmitterSeparator)
247259
const beforeEvents = await this.eventEmitter?.emitAsync(
248-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeUpdate'].join(EventEmitterSeparator),
249-
{ _id, update, options },
260+
beforeEventName,
261+
{ _id, update, options, eventName: beforeEventName },
250262
)
251263
for (const beforeEvent of beforeEvents) {
252264
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -282,9 +294,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
282294
throw new NotFoundException()
283295
}
284296
if (this.eventEmitter) {
297+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterUpdate'].join(EventEmitterSeparator)
285298
const afterEvents = await this.eventEmitter?.emitAsync(
286-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterUpdate'].join(EventEmitterSeparator),
287-
{ before, updated },
299+
eventName,
300+
{ before, updated, eventName },
288301
)
289302
for (const afterEvent of afterEvents) {
290303
if (afterEvent?.updated) updated = { ...updated, ...afterEvent.updated }
@@ -300,9 +313,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
300313
): Promise<ModifyResult<Query<T, T, any, T>>> {
301314
this.logger.debug(['upsert', JSON.stringify(Object.values(arguments))].join(' '));
302315
if (this.eventEmitter) {
316+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeUpsert'].join(EventEmitterSeparator);
303317
const beforeEvents = await this.eventEmitter?.emitAsync(
304-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeUpsert'].join(EventEmitterSeparator),
305-
{ filter, update, options },
318+
beforeEventName,
319+
{ filter, update, options, eventName: beforeEventName },
306320
);
307321
for (const beforeEvent of beforeEvents) {
308322
if (beforeEvent?.stop) throw beforeEvent?.stop;
@@ -338,9 +352,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
338352
.exec();
339353

340354
if (this.eventEmitter) {
355+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterUpsert'].join(EventEmitterSeparator)
341356
const afterEvents = await this.eventEmitter?.emitAsync(
342-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterUpsert'].join(EventEmitterSeparator),
343-
{ result, before },
357+
eventName,
358+
{ result, before, eventName },
344359
);
345360
for (const afterEvent of afterEvents) {
346361
if (afterEvent?.result) result = { ...result, ...afterEvent.result };
@@ -358,9 +373,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
358373
public async delete<T extends AbstractSchema | Document>(_id: Types.ObjectId | any, options?: QueryOptions<T> | null | undefined): Promise<Query<T, T, any, T>> {
359374
this.logger.debug(['delete', JSON.stringify(Object.values(arguments))].join(' '))
360375
if (this.eventEmitter) {
376+
const beforeEventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeDelete'].join(EventEmitterSeparator)
361377
const beforeEvents = await this.eventEmitter?.emitAsync(
362-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'beforeDelete'].join(EventEmitterSeparator),
363-
{ _id, options },
378+
beforeEventName,
379+
{ _id, options, eventName: beforeEventName },
364380
)
365381
for (const beforeEvent of beforeEvents) {
366382
if (beforeEvent?.stop) throw beforeEvent?.stop
@@ -374,9 +390,10 @@ export abstract class AbstractServiceSchema extends AbstractService implements S
374390
throw new NotFoundException()
375391
}
376392
if (this.eventEmitter) {
393+
const eventName = [this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterDelete'].join(EventEmitterSeparator)
377394
const afterEvents = await this.eventEmitter?.emitAsync(
378-
[this.moduleName.toLowerCase(), this.serviceName.toLowerCase(), 'service', 'afterDelete'].join(EventEmitterSeparator),
379-
{ before, deleted },
395+
eventName,
396+
{ before, deleted, eventName },
380397
)
381398
for (const afterEvent of afterEvents) {
382399
if (afterEvent?.deleted) deleted = { ...deleted, ...afterEvent.deleted }

0 commit comments

Comments
 (0)