import { Global, Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { DataSource } from 'typeorm'; import { DatabaseConfig, databaseConfig } from './database.config'; import { APP_DATASOURCES } from './database.constants'; import { typeormTransactionalDataSourceFactory } from './utils/typeorm-data-source-factory'; import { typeormModuleOptionsFactory } from './utils/typeorm-module-options-factory'; const dataSources: DataSource[] = []; const typeormModules = [ TypeOrmModule.forRootAsync({ imports: databaseConfig.asProvider().imports, dataSourceFactory: typeormTransactionalDataSourceFactory(), useFactory: async (dbConfig: DatabaseConfig) => { const config = await typeormModuleOptionsFactory(dbConfig); return config; }, inject: [databaseConfig.KEY], }), ]; const dataSourcesProvider = { provide: APP_DATASOURCES, useValue: dataSources, }; @Global() @Module({ imports: [ConfigModule.forFeature(databaseConfig), ...typeormModules], providers: [dataSourcesProvider], exports: [...typeormModules, dataSourcesProvider], }) export class AppDatabaseModule {}