import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule, ConfigService } from '@nestjs/config'; import * as Joi from 'joi'; import { UsersModule } from './users/users.module'; import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; import configuration from './config/configuration'; @Module({ imports: [ ConfigModule.forRoot({ load: [configuration], validationSchema: Joi.object({ NODE_ENV: Joi.string() .valid('development', 'production', 'test', 'provision') .default('development'), PORT: Joi.number().default(3000), DATABASE_CLIENT: Joi.valid('mysql', 'postgres'), DATABASE_HOST: Joi.string(), DATABASE_NAME: Joi.string(), DATABASE_USERNAME: Joi.string(), DATABASE_PASSWORD: Joi.string().empty('').default(''), DATABASE_PORT: Joi.number().default(5432), }), }), TypeOrmModule.forRootAsync({ imports: [ConfigModule], useFactory: (configService: ConfigService) => { return { type: configService.get<'postgres' | 'mysql'>('database.client'), host: configService.get('database.host'), port: configService.get('database.port'), username: configService.get('database.username'), password: configService.get('database.password'), database: configService.get('database.name'), entities: [], synchronize: true, autoLoadEntities: true, logging: true, namingStrategy: new SnakeNamingStrategy(), }; }, inject: [ConfigService], }), UsersModule, ], }) export class AppModule {}