import { Optional } from '@nestjs/common'; import { isNil } from 'lodash'; import { DataSource, EntitySubscriberInterface, EntityTarget, EventSubscriber, InsertEvent, ObjectLiteral, ObjectType, RecoverEvent, RemoveEvent, SoftRemoveEvent, TransactionCommitEvent, TransactionRollbackEvent, TransactionStartEvent, UpdateEvent, } from 'typeorm'; import { RepositoryType } from '../types'; import { getCustomRepository } from '../utils'; type SubscriberEvent = | InsertEvent | UpdateEvent | SoftRemoveEvent | RemoveEvent | RecoverEvent | TransactionStartEvent | TransactionCommitEvent | TransactionRollbackEvent; @EventSubscriber() export abstract class BaseSubscriber implements EntitySubscriberInterface { protected abstract entity: ObjectType; protected constructor(@Optional() protected dataSource?: DataSource) { if (!isNil(this.dataSource)) { this.dataSource.subscribers.push(this); } } protected getDataSource(event: SubscriberEvent) { return this.dataSource ?? event.connection; } protected getManage(event: SubscriberEvent) { return this.dataSource ? this.dataSource.manager : event.manager; } listenTo() { return this.entity; } async afterLoad(entity: any) { if ('parent' in entity && isNil(entity.depth)) { entity.depth = 0; } } protected getRepository< C extends ClassType

, P extends RepositoryType, R extends EntityTarget, >(event: SubscriberEvent, respository?: C, entity?: R) { return isNil(respository) ? this.getDataSource(event).getRepository(entity ?? this.entity) : getCustomRepository(this.getDataSource(event), respository); } protected isUpdated(cloumn: keyof T, event: UpdateEvent) { return !!event.updatedColumns.find((o) => o.propertyName === cloumn); } }