Skip to content

Commit 4c02833

Browse files
authored
refactor(Refactor/divide graphql config): Implement graphql config service (#40)
* Refactor: Refactor TypeORM configuration to use injectable for DI * Refactor: Replace SettingModule with GraphqlConfigService for GraphQL configuration * Refactor: Remove SettingModule and SettingService as part of code cleanup * Refactor: Move UtilModule and UtilService to common/util directory * Refactor: Remove commented uploads option from GraphqlConfigService
1 parent f2cde67 commit 4c02833

14 files changed

+101
-97
lines changed

generator/templates/resolver.spec.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
import { {{pascalCase tableName}}Service } from './{{tableName}}.service'
88
import { GetManyInput, GetOneInput } from 'src/common/graphql/custom.input'
99
import { {{pascalCase tableName}} } from './entities/{{tableName}}.entity'
10-
import { UtilModule } from 'src/common/shared/services/util.module';
11-
import { UtilService } from 'src/common/shared/services/util.service';
10+
import { UtilModule } from 'src/common/util/util.module';
11+
import { UtilService } from 'src/common/util/util.service';
1212
import { DataSource } from 'typeorm';
1313

1414
import { Create{{pascalCase tableName}}Input, Update{{pascalCase tableName}}Input } from './inputs/{{tableName}}.input'

generator/templates/service.spec.hbs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import { {{pascalCase tableName}} } from './entities/{{tableName}}.entity'
1111
import { Create{{pascalCase tableName}}Input, Update{{pascalCase tableName}}Input } from './inputs/{{tableName}}.input'
1212
import { ExtendedRepository } from 'src/common/graphql/customExtended'
1313
import { OneRepoQuery, RepoQuery } from 'src/common/graphql/types'
14-
import { UtilModule } from 'src/common/shared/services/util.module';
15-
import { UtilService } from 'src/common/shared/services/util.service';
14+
import { UtilModule } from 'src/common/util/util.module';
15+
import { UtilService } from 'src/common/util/util.service';
1616

1717
describe('{{pascalCase tableName}}Service', () => {
1818
let service: {{pascalCase tableName}}Service

src/app.module.ts

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
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 { GraphqlConfigService } from './common/config/graphql-config.service';
10+
import { TypeORMConfigService } from './common/config/ormconfig.service';
1311
import { getEnvPath } from './common/helper/env.helper';
1412
import { envValidation } from './common/helper/env.validation';
15-
import { SettingModule } from './common/shared/setting/setting.module';
16-
import { SettingService } from './common/shared/setting/setting.service';
1713
import { HealthModule } from './health/health.module';
1814
import { UploadModule } from './upload/upload.module';
1915
import { UserModule } from './user/user.module';
@@ -23,20 +19,15 @@ import { UserModule } from './user/user.module';
2319
ConfigModule.forRoot({
2420
envFilePath: getEnvPath(`${__dirname}/..`),
2521
validate: envValidation,
26-
load: [typeormConfigLoader],
2722
}),
2823
GraphQLModule.forRootAsync<ApolloDriverConfig>({
2924
driver: ApolloDriver,
30-
imports: [SettingModule],
31-
inject: [SettingService],
32-
useFactory: (settingService: SettingService) =>
33-
settingService.graphqlUseFactory,
25+
useClass: GraphqlConfigService,
26+
imports: [ConfigModule],
3427
}),
3528
TypeOrmModule.forRootAsync({
29+
useClass: TypeORMConfigService,
3630
imports: [ConfigModule],
37-
inject: [ConfigService],
38-
useFactory: (configService: ConfigService) =>
39-
configService.get(typeormConfigKey),
4031
}),
4132
UserModule,
4233
AuthModule,

src/auth/auth.module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { JwtModule } from '@nestjs/jwt';
44
import { PassportModule } from '@nestjs/passport';
55

66
import { EnvironmentVariables } from 'src/common/helper/env.validation';
7-
import { UtilModule } from 'src/common/shared/services/util.module';
7+
import { UtilModule } from 'src/common/util/util.module';
88
import { UserModule } from 'src/user/user.module';
99

1010
import { AuthResolver } from './auth.resolver';

src/auth/auth.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as bcrypt from 'bcrypt';
66

77
import { SignInInput, SignUpInput } from 'src/auth/inputs/auth.input';
88
import { EnvironmentVariables } from 'src/common/helper/env.validation';
9-
import { UtilService } from 'src/common/shared/services/util.service';
9+
import { UtilService } from 'src/common/util/util.service';
1010
import { User } from 'src/user/entities/user.entity';
1111

1212
import { UserService } from '../user/user.service';
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { ApolloDriverConfig } from '@nestjs/apollo';
2+
import { Injectable } from '@nestjs/common';
3+
import { ConfigService } from '@nestjs/config';
4+
import { GqlOptionsFactory } from '@nestjs/graphql';
5+
6+
import {
7+
ApolloServerPluginLandingPageLocalDefault,
8+
ApolloServerPluginLandingPageProductionDefault,
9+
} from '@apollo/server/plugin/landingPage/default';
10+
import GraphQLJSON from 'graphql-type-json';
11+
import { join } from 'path';
12+
import { cwd } from 'process';
13+
14+
import { formatError } from '../format/graphql-error.format';
15+
16+
@Injectable()
17+
export class GraphqlConfigService
18+
implements GqlOptionsFactory<ApolloDriverConfig>
19+
{
20+
constructor(private readonly configService: ConfigService) {}
21+
22+
createGqlOptions(): Promise<ApolloDriverConfig> | ApolloDriverConfig {
23+
return {
24+
resolvers: { JSON: GraphQLJSON },
25+
autoSchemaFile: join(
26+
cwd(),
27+
`${this.configService.get('NODE_ENV') === 'test' ? 'test' : 'src'}/graphql-schema.gql`,
28+
),
29+
sortSchema: true,
30+
playground: false,
31+
plugins: [
32+
this.configService.get('NODE_ENV') === 'production'
33+
? ApolloServerPluginLandingPageProductionDefault()
34+
: ApolloServerPluginLandingPageLocalDefault(),
35+
],
36+
37+
context: ({ req }) => ({ req }),
38+
cache: 'bounded',
39+
formatError,
40+
};
41+
}
42+
}
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));

src/common/shared/setting/setting.module.ts

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/common/shared/setting/setting.service.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.

0 commit comments

Comments
 (0)