diff --git a/generator/templates/resolver.spec.hbs b/generator/templates/resolver.spec.hbs index 11d1a3b..5467bc1 100644 --- a/generator/templates/resolver.spec.hbs +++ b/generator/templates/resolver.spec.hbs @@ -7,8 +7,8 @@ import { import { {{pascalCase tableName}}Service } from './{{tableName}}.service' import { GetManyInput, GetOneInput } from 'src/common/graphql/custom.input' import { {{pascalCase tableName}} } from './entities/{{tableName}}.entity' -import { UtilModule } from 'src/common/shared/services/util.module'; -import { UtilService } from 'src/common/shared/services/util.service'; +import { UtilModule } from 'src/common/util/util.module'; +import { UtilService } from 'src/common/util/util.service'; import { DataSource } from 'typeorm'; import { Create{{pascalCase tableName}}Input, Update{{pascalCase tableName}}Input } from './inputs/{{tableName}}.input' diff --git a/generator/templates/service.spec.hbs b/generator/templates/service.spec.hbs index 6c76b5d..5d77079 100644 --- a/generator/templates/service.spec.hbs +++ b/generator/templates/service.spec.hbs @@ -11,8 +11,8 @@ import { {{pascalCase tableName}} } from './entities/{{tableName}}.entity' import { Create{{pascalCase tableName}}Input, Update{{pascalCase tableName}}Input } from './inputs/{{tableName}}.input' import { ExtendedRepository } from 'src/common/graphql/customExtended' import { OneRepoQuery, RepoQuery } from 'src/common/graphql/types' -import { UtilModule } from 'src/common/shared/services/util.module'; -import { UtilService } from 'src/common/shared/services/util.service'; +import { UtilModule } from 'src/common/util/util.module'; +import { UtilService } from 'src/common/util/util.service'; describe('{{pascalCase tableName}}Service', () => { let service: {{pascalCase tableName}}Service diff --git a/src/app.module.ts b/src/app.module.ts index adde4a2..b9d3ce4 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,19 +1,15 @@ import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { Module } from '@nestjs/common'; -import { ConfigModule, ConfigService } from '@nestjs/config'; +import { ConfigModule } from '@nestjs/config'; import { GraphQLModule } from '@nestjs/graphql'; import { TypeOrmModule } from '@nestjs/typeorm'; import { AuthModule } from './auth/auth.module'; import { CustomCacheModule } from './cache/custom-cache.module'; -import { - typeormConfigKey, - typeormConfigLoader, -} from './common/config/ormconfig'; +import { GraphqlConfigService } from './common/config/graphql-config.service'; +import { TypeORMConfigService } from './common/config/ormconfig.service'; import { getEnvPath } from './common/helper/env.helper'; import { envValidation } from './common/helper/env.validation'; -import { SettingModule } from './common/shared/setting/setting.module'; -import { SettingService } from './common/shared/setting/setting.service'; import { HealthModule } from './health/health.module'; import { UploadModule } from './upload/upload.module'; import { UserModule } from './user/user.module'; @@ -23,20 +19,15 @@ import { UserModule } from './user/user.module'; ConfigModule.forRoot({ envFilePath: getEnvPath(`${__dirname}/..`), validate: envValidation, - load: [typeormConfigLoader], }), GraphQLModule.forRootAsync({ driver: ApolloDriver, - imports: [SettingModule], - inject: [SettingService], - useFactory: (settingService: SettingService) => - settingService.graphqlUseFactory, + useClass: GraphqlConfigService, + imports: [ConfigModule], }), TypeOrmModule.forRootAsync({ + useClass: TypeORMConfigService, imports: [ConfigModule], - inject: [ConfigService], - useFactory: (configService: ConfigService) => - configService.get(typeormConfigKey), }), UserModule, AuthModule, diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 4acc387..8ee9a28 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -4,7 +4,7 @@ import { JwtModule } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; import { EnvironmentVariables } from 'src/common/helper/env.validation'; -import { UtilModule } from 'src/common/shared/services/util.module'; +import { UtilModule } from 'src/common/util/util.module'; import { UserModule } from 'src/user/user.module'; import { AuthResolver } from './auth.resolver'; diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 68da4d8..243b88f 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -6,7 +6,7 @@ import * as bcrypt from 'bcrypt'; import { SignInInput, SignUpInput } from 'src/auth/inputs/auth.input'; import { EnvironmentVariables } from 'src/common/helper/env.validation'; -import { UtilService } from 'src/common/shared/services/util.service'; +import { UtilService } from 'src/common/util/util.service'; import { User } from 'src/user/entities/user.entity'; import { UserService } from '../user/user.service'; diff --git a/src/common/config/graphql-config.service.ts b/src/common/config/graphql-config.service.ts new file mode 100644 index 0000000..5405aac --- /dev/null +++ b/src/common/config/graphql-config.service.ts @@ -0,0 +1,42 @@ +import { ApolloDriverConfig } from '@nestjs/apollo'; +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { GqlOptionsFactory } from '@nestjs/graphql'; + +import { + ApolloServerPluginLandingPageLocalDefault, + ApolloServerPluginLandingPageProductionDefault, +} from '@apollo/server/plugin/landingPage/default'; +import GraphQLJSON from 'graphql-type-json'; +import { join } from 'path'; +import { cwd } from 'process'; + +import { formatError } from '../format/graphql-error.format'; + +@Injectable() +export class GraphqlConfigService + implements GqlOptionsFactory +{ + constructor(private readonly configService: ConfigService) {} + + createGqlOptions(): Promise | ApolloDriverConfig { + return { + resolvers: { JSON: GraphQLJSON }, + autoSchemaFile: join( + cwd(), + `${this.configService.get('NODE_ENV') === 'test' ? 'test' : 'src'}/graphql-schema.gql`, + ), + sortSchema: true, + playground: false, + plugins: [ + this.configService.get('NODE_ENV') === 'production' + ? ApolloServerPluginLandingPageProductionDefault() + : ApolloServerPluginLandingPageLocalDefault(), + ], + + context: ({ req }) => ({ req }), + cache: 'bounded', + formatError, + }; + } +} diff --git a/src/common/config/ormconfig.service.ts b/src/common/config/ormconfig.service.ts new file mode 100644 index 0000000..708f7b4 --- /dev/null +++ b/src/common/config/ormconfig.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm'; + +import { setTypeormConfig } from './ormconfig'; + +@Injectable() +export class TypeORMConfigService implements TypeOrmOptionsFactory { + constructor(private readonly configService: ConfigService) {} + + createTypeOrmOptions(): Promise | TypeOrmModuleOptions { + return setTypeormConfig(this.configService); + } +} diff --git a/src/common/config/ormconfig.ts b/src/common/config/ormconfig.ts index 3b70515..9e8bc00 100644 --- a/src/common/config/ormconfig.ts +++ b/src/common/config/ormconfig.ts @@ -1,4 +1,4 @@ -import { registerAs } from '@nestjs/config'; +import { ConfigService } from '@nestjs/config'; import { config } from 'dotenv'; import { join } from 'path'; @@ -11,29 +11,33 @@ config({ path: getEnvPath(cwd()), }); -const typeormConfig: DataSourceOptions = { - type: 'postgres', - host: env.DB_HOST, - port: Number(env.DB_PORT), - username: env.DB_USER, - password: env.DB_PASSWORD, - database: env.DB_NAME, - entities: - env.NODE_ENV === 'test' - ? [join(cwd(), 'src', '**', '*.entity.{ts,js}')] - : [join(cwd(), 'dist', '**', '*.entity.js')], - synchronize: env.NODE_ENV !== 'production', - dropSchema: env.NODE_ENV === 'test', - migrations: [ - join(cwd(), 'dist', 'common', 'database', 'migrations', '*{.ts,.js}'), - ], - migrationsRun: false, - logging: false, +export const setTypeormConfig = ( + conf: NodeJS.ProcessEnv | ConfigService, +): DataSourceOptions => { + const getConfigValue = + conf instanceof ConfigService + ? conf.get.bind(conf) + : (key: string) => conf[key]; + + return { + type: 'postgres', + host: getConfigValue('DB_HOST'), + port: Number(getConfigValue('DB_PORT')), + username: getConfigValue('DB_USER'), + password: getConfigValue('DB_PASSWORD'), + database: getConfigValue('DB_NAME'), + entities: + getConfigValue('NODE_ENV') === 'test' + ? [join(cwd(), 'src', '**', '*.entity.{ts,js}')] + : [join(cwd(), 'dist', '**', '*.entity.js')], + synchronize: getConfigValue('NODE_ENV') !== 'production', + dropSchema: getConfigValue('NODE_ENV') === 'test', + migrations: [ + join(cwd(), 'dist', 'common', 'database', 'migrations', '*{.ts,.js}'), + ], + migrationsRun: false, + logging: false, + }; }; -export const typeormConfigKey = 'typeorm'; -export const typeormConfigLoader = registerAs( - typeormConfigKey, - () => typeormConfig, -); -export default new DataSource(typeormConfig); +export default new DataSource(setTypeormConfig(env)); diff --git a/src/common/shared/setting/setting.module.ts b/src/common/shared/setting/setting.module.ts deleted file mode 100644 index 948ae50..0000000 --- a/src/common/shared/setting/setting.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; - -import { UtilModule } from '../services/util.module'; -import { SettingService } from './setting.service'; - -@Module({ - imports: [UtilModule], - providers: [SettingService], - exports: [SettingService], -}) -export class SettingModule {} diff --git a/src/common/shared/setting/setting.service.ts b/src/common/shared/setting/setting.service.ts deleted file mode 100644 index aef172f..0000000 --- a/src/common/shared/setting/setting.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ApolloDriverConfig } from '@nestjs/apollo'; -import { Injectable } from '@nestjs/common'; - -import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default'; -import GraphQLJSON from 'graphql-type-json'; -import { join } from 'path'; - -import { formatError } from 'src/common/format/graphql-error.format'; - -import { UtilService } from '../services/util.service'; - -@Injectable() -export class SettingService { - constructor(private readonly utilService: UtilService) {} - - get graphqlUseFactory(): - | Omit - | (Promise> & { uploads: boolean }) { - return { - uploads: false, - resolvers: { JSON: GraphQLJSON }, - autoSchemaFile: join( - process.cwd(), - `${this.utilService.nodeEnv === 'test' ? 'test' : 'src'}/graphql-schema.gql`, - ), - sortSchema: true, - playground: false, - ...(!this.utilService.isProduction && { - plugins: [ApolloServerPluginLandingPageLocalDefault()], - }), - context: ({ req }) => ({ req }), - cache: 'bounded', - formatError, - }; - } -} diff --git a/src/common/shared/services/util.module.ts b/src/common/util/util.module.ts similarity index 100% rename from src/common/shared/services/util.module.ts rename to src/common/util/util.module.ts diff --git a/src/common/shared/services/util.service.ts b/src/common/util/util.service.ts similarity index 100% rename from src/common/shared/services/util.service.ts rename to src/common/util/util.service.ts diff --git a/src/user/user.resolver.spec.ts b/src/user/user.resolver.spec.ts index 305aa54..f80a9ed 100644 --- a/src/user/user.resolver.spec.ts +++ b/src/user/user.resolver.spec.ts @@ -7,8 +7,8 @@ import { MockServiceFactory, } from 'src/common/factory/mockFactory'; import { GetManyInput, GetOneInput } from 'src/common/graphql/custom.input'; -import { UtilModule } from 'src/common/shared/services/util.module'; -import { UtilService } from 'src/common/shared/services/util.service'; +import { UtilModule } from 'src/common/util/util.module'; +import { UtilService } from 'src/common/util/util.service'; import { User } from './entities/user.entity'; import { CreateUserInput, UpdateUserInput } from './inputs/user.input'; diff --git a/src/user/user.service.spec.ts b/src/user/user.service.spec.ts index bf82be9..ef6685a 100644 --- a/src/user/user.service.spec.ts +++ b/src/user/user.service.spec.ts @@ -7,8 +7,8 @@ import { } from 'src/common/factory/mockFactory'; import { ExtendedRepository } from 'src/common/graphql/customExtended'; import { OneRepoQuery, RepoQuery } from 'src/common/graphql/types'; -import { UtilModule } from 'src/common/shared/services/util.module'; -import { UtilService } from 'src/common/shared/services/util.service'; +import { UtilModule } from 'src/common/util/util.module'; +import { UtilService } from 'src/common/util/util.service'; import { User } from './entities/user.entity'; import { CreateUserInput, UpdateUserInput } from './inputs/user.input';