import { DynamicModule, Module, Provider, Type } from '@nestjs/common'; import { getDataSourceToken, TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm'; import { DataSource, ObjectType } from 'typeorm'; import { CUSTOM_REPOSITORY_METADATA } from '@/modules/database/constants'; import { DataExistConstraint, TreeUniqueConstraint, TreeUniqueExistContraint, UniqueConstraint, UniqueExistConstraint, } from './constraints'; @Module({}) export class DatabaseModule { static forRoot(configRegister: () => TypeOrmModuleOptions): DynamicModule { return { global: true, module: DatabaseModule, imports: [TypeOrmModule.forRoot(configRegister())], providers: [ DataExistConstraint, UniqueConstraint, UniqueExistConstraint, TreeUniqueConstraint, TreeUniqueExistContraint, ], }; } static forRepository>( repositories: T[], datasourceName?: string, ): DynamicModule { const providers: Provider[] = []; for (const Repository of repositories) { const entity = Reflect.getMetadata(CUSTOM_REPOSITORY_METADATA, Repository); if (!entity) { continue; } providers.push({ inject: [getDataSourceToken(datasourceName)], provide: Repository, useFactory: (datasource: DataSource): InstanceType => { const base = datasource.getRepository>(entity); return new Repository(base.target, base.manager, base.queryRunner); }, }); } return { exports: providers, module: DatabaseModule, providers, }; } }