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 { LoggerModule } from 'nestjs-pino'; import { TransactionModule } from './transaction/transaction.module'; import { ProductModule } from './product/product.module'; import { ConfigurableModule } from './configurable/configurable.module'; import { AuthModule } from './auth/auth.module'; import configuration from './config/configuration'; import { MulterModule } from '@nestjs/platform-express'; @Module({ imports: [ LoggerModule.forRoot(), ConfigModule.forRoot({ load: [configuration], validationSchema: Joi.object({ NODE_ENV: Joi.string() .valid('development', 'production', 'test', 'provision') .default('development'), PORT: Joi.number().default(3000), SECRET: Joi.string().required(), DATABASE_CLIENT: Joi.valid('mysql', 'postgres').required(), DATABASE_HOST: Joi.string().required(), DATABASE_NAME: Joi.string().required(), DATABASE_USERNAME: Joi.string().required(), DATABASE_PASSWORD: Joi.string().empty('').default(''), DATABASE_PORT: Joi.number().default(5432), }), }), MulterModule.register({ dest: './files', }), 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, seeds: ['src/seeds/**/*{.ts,.js}'], factories: ['src/factories/**/*{.ts,.js}'], namingStrategy: new SnakeNamingStrategy(), }; }, inject: [ConfigService], }), UsersModule, TransactionModule, ConfigurableModule, ProductModule, AuthModule, ], }) export class AppModule {}