Skip to content

Commit 78645fb

Browse files
committed
Refactor: Refactor TypeORM configuration to use injectable for DI
1 parent f2cde67 commit 78645fb

3 files changed

Lines changed: 46 additions & 34 deletions

File tree

src/app.module.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
22
import { Module } from '@nestjs/common';
3-
import { ConfigModule, ConfigService } from '@nestjs/config';
3+
import { ConfigModule } from '@nestjs/config';
44
import { GraphQLModule } from '@nestjs/graphql';
55
import { TypeOrmModule } from '@nestjs/typeorm';
66

77
import { AuthModule } from './auth/auth.module';
88
import { CustomCacheModule } from './cache/custom-cache.module';
9-
import {
10-
typeormConfigKey,
11-
typeormConfigLoader,
12-
} from './common/config/ormconfig';
9+
import { TypeORMConfigService } from './common/config/ormconfig.service';
1310
import { getEnvPath } from './common/helper/env.helper';
1411
import { envValidation } from './common/helper/env.validation';
1512
import { SettingModule } from './common/shared/setting/setting.module';
@@ -23,7 +20,6 @@ import { UserModule } from './user/user.module';
2320
ConfigModule.forRoot({
2421
envFilePath: getEnvPath(`${__dirname}/..`),
2522
validate: envValidation,
26-
load: [typeormConfigLoader],
2723
}),
2824
GraphQLModule.forRootAsync<ApolloDriverConfig>({
2925
driver: ApolloDriver,
@@ -33,10 +29,8 @@ import { UserModule } from './user/user.module';
3329
settingService.graphqlUseFactory,
3430
}),
3531
TypeOrmModule.forRootAsync({
32+
useClass: TypeORMConfigService,
3633
imports: [ConfigModule],
37-
inject: [ConfigService],
38-
useFactory: (configService: ConfigService) =>
39-
configService.get(typeormConfigKey),
4034
}),
4135
UserModule,
4236
AuthModule,
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { ConfigService } from '@nestjs/config';
3+
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
4+
5+
import { setTypeormConfig } from './ormconfig';
6+
7+
@Injectable()
8+
export class TypeORMConfigService implements TypeOrmOptionsFactory {
9+
constructor(private readonly configService: ConfigService) {}
10+
11+
createTypeOrmOptions(): Promise<TypeOrmModuleOptions> | TypeOrmModuleOptions {
12+
return setTypeormConfig(this.configService);
13+
}
14+
}

src/common/config/ormconfig.ts

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { registerAs } from '@nestjs/config';
1+
import { ConfigService } from '@nestjs/config';
22

33
import { config } from 'dotenv';
44
import { join } from 'path';
@@ -11,29 +11,33 @@ config({
1111
path: getEnvPath(cwd()),
1212
});
1313

14-
const typeormConfig: DataSourceOptions = {
15-
type: 'postgres',
16-
host: env.DB_HOST,
17-
port: Number(env.DB_PORT),
18-
username: env.DB_USER,
19-
password: env.DB_PASSWORD,
20-
database: env.DB_NAME,
21-
entities:
22-
env.NODE_ENV === 'test'
23-
? [join(cwd(), 'src', '**', '*.entity.{ts,js}')]
24-
: [join(cwd(), 'dist', '**', '*.entity.js')],
25-
synchronize: env.NODE_ENV !== 'production',
26-
dropSchema: env.NODE_ENV === 'test',
27-
migrations: [
28-
join(cwd(), 'dist', 'common', 'database', 'migrations', '*{.ts,.js}'),
29-
],
30-
migrationsRun: false,
31-
logging: false,
14+
export const setTypeormConfig = (
15+
conf: NodeJS.ProcessEnv | ConfigService,
16+
): DataSourceOptions => {
17+
const getConfigValue =
18+
conf instanceof ConfigService
19+
? conf.get.bind(conf)
20+
: (key: string) => conf[key];
21+
22+
return {
23+
type: 'postgres',
24+
host: getConfigValue('DB_HOST'),
25+
port: Number(getConfigValue('DB_PORT')),
26+
username: getConfigValue('DB_USER'),
27+
password: getConfigValue('DB_PASSWORD'),
28+
database: getConfigValue('DB_NAME'),
29+
entities:
30+
getConfigValue('NODE_ENV') === 'test'
31+
? [join(cwd(), 'src', '**', '*.entity.{ts,js}')]
32+
: [join(cwd(), 'dist', '**', '*.entity.js')],
33+
synchronize: getConfigValue('NODE_ENV') !== 'production',
34+
dropSchema: getConfigValue('NODE_ENV') === 'test',
35+
migrations: [
36+
join(cwd(), 'dist', 'common', 'database', 'migrations', '*{.ts,.js}'),
37+
],
38+
migrationsRun: false,
39+
logging: false,
40+
};
3241
};
3342

34-
export const typeormConfigKey = 'typeorm';
35-
export const typeormConfigLoader = registerAs(
36-
typeormConfigKey,
37-
() => typeormConfig,
38-
);
39-
export default new DataSource(typeormConfig);
43+
export default new DataSource(setTypeormConfig(env));

0 commit comments

Comments
 (0)