feat(api): enhance base-repository

This commit is contained in:
yassinedorbozgithub 2024-10-07 15:38:10 +01:00
parent 453882b6fd
commit 16101f2638

View File

@ -33,9 +33,11 @@ export enum EHook {
preCreate = 'preCreate', preCreate = 'preCreate',
preUpdate = 'preUpdate', preUpdate = 'preUpdate',
preDelete = 'preDelete', preDelete = 'preDelete',
preValidate = 'preValidate',
postCreate = 'postCreate', postCreate = 'postCreate',
postUpdate = 'postUpdate', postUpdate = 'postUpdate',
postDelete = 'postDelete', postDelete = 'postDelete',
postValidate = 'postValidate',
} }
export abstract class BaseRepository< export abstract class BaseRepository<
@ -63,8 +65,8 @@ export abstract class BaseRepository<
return this.populate; return this.populate;
} }
getEventName(suffix: EHook) { getEventName(suffix: EHook): any {
return `hook:${this.cls.name.toLocaleLowerCase()}:${suffix.toLocaleLowerCase()}`; return `hook:${this.cls.name.toLocaleLowerCase()}:${suffix}`;
} }
private registerLifeCycleHooks() { private registerLifeCycleHooks() {
@ -73,15 +75,21 @@ export abstract class BaseRepository<
hooks?.validate.pre.execute(async function () { hooks?.validate.pre.execute(async function () {
const doc = this as HydratedDocument<T>; const doc = this as HydratedDocument<T>;
repository.emitter.emit(repository.getEventName(EHook.preValidate), doc);
await repository.preValidate(doc); await repository.preValidate(doc);
}); });
hooks?.validate.post.execute(async function (created: HydratedDocument<T>) { hooks?.validate.post.execute(async function (created: HydratedDocument<T>) {
repository.emitter.emit(
repository.getEventName(EHook.postValidate),
created,
);
await repository.postValidate(created); await repository.postValidate(created);
}); });
hooks?.save.pre.execute(async function () { hooks?.save.pre.execute(async function () {
const doc = this as HydratedDocument<T>; const doc = this as HydratedDocument<T>;
repository.emitter.emit(repository.getEventName(EHook.preCreate), doc);
await repository.preCreate(doc); await repository.preCreate(doc);
}); });
@ -96,11 +104,21 @@ export abstract class BaseRepository<
hooks?.deleteOne.pre.execute(async function () { hooks?.deleteOne.pre.execute(async function () {
const query = this as Query<DeleteResult, D, unknown, T, 'deleteOne'>; const query = this as Query<DeleteResult, D, unknown, T, 'deleteOne'>;
const criteria = query.getQuery(); const criteria = query.getQuery();
repository.emitter.emit(
repository.getEventName(EHook.preDelete),
query,
criteria,
);
await repository.preDelete(query, criteria); await repository.preDelete(query, criteria);
}); });
hooks?.deleteOne.post.execute(async function (result: DeleteResult) { hooks?.deleteOne.post.execute(async function (result: DeleteResult) {
const query = this as Query<DeleteResult, D, unknown, T, 'deleteOne'>; const query = this as Query<DeleteResult, D, unknown, T, 'deleteOne'>;
repository.emitter.emit(
repository.getEventName(EHook.postDelete),
query,
result,
);
await repository.postDelete(query, result); await repository.postDelete(query, result);
}); });