diff --git a/api/src/utils/generics/base-repository.ts b/api/src/utils/generics/base-repository.ts index 13cdb585..cfdf4bbf 100644 --- a/api/src/utils/generics/base-repository.ts +++ b/api/src/utils/generics/base-repository.ts @@ -6,6 +6,7 @@ * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). */ +import { Inject } from '@nestjs/common'; import { EventEmitter2, IHookEntities, @@ -79,7 +80,8 @@ export abstract class BaseRepository< private readonly leanOpts = { virtuals: true, defaults: true, getters: true }; - eventEmitter: EventEmitter2; + @Inject(EventEmitter2) + readonly eventEmitter: EventEmitter2; constructor( readonly model: Model, @@ -87,7 +89,6 @@ export abstract class BaseRepository< protected readonly populate: P[] = [], protected readonly clsPopulate?: new () => TFull, ) { - this.eventEmitter = new EventEmitter2(); this.registerLifeCycleHooks(); } @@ -170,15 +171,21 @@ export abstract class BaseRepository< const query = this as Query; const criteria = query.getQuery(); await repository.preDelete(query, criteria); + await repository.eventEmitter.emitAsync( + repository.getEventName(EHook.preDelete), + query, + criteria, + ); }); hooks.deleteMany.post.execute(async function (result: DeleteResult) { - await repository.eventEmitter.emitAsync( - repository.getEventName(EHook.postDelete), - result, - ); const query = this as Query; await repository.postDelete(query, result); + await repository.eventEmitter.emitAsync( + repository.getEventName(EHook.postDelete), + query, + result, + ); }); hooks.findOneAndUpdate.pre.execute(async function () { diff --git a/api/types/event-emitter.d.ts b/api/types/event-emitter.d.ts index 1c8869e4..b2188b89 100644 --- a/api/types/event-emitter.d.ts +++ b/api/types/event-emitter.d.ts @@ -330,11 +330,18 @@ declare module '@nestjs/event-emitter' { : `hook:${G}:${TNormalizedOrCustomized}` : never; + type TEventName = Exclude< + customEvent, + `${string}:*` + >; + interface ListenerFn { (value: EventValueOf, ...values: any[]): void; } class EventEmitter2 { + constructor(options?: ConstructorOptions); + emit( customEvent: customEvent, value: EventValueOf, @@ -396,6 +403,8 @@ declare module '@nestjs/event-emitter' { customEvent: customEvent, listener: ListenerFn, ): this; + + public readonly event: TEventName; } declare type OnEventMethodDecorator<