init
This commit is contained in:
18
src/config/config.module.ts
Normal file
18
src/config/config.module.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { Global, Module } from '@nestjs/common';
|
||||
import { ConfigModule } from '@nestjs/config';
|
||||
import { databaseConfig } from './database.config';
|
||||
import { validateEnvironment } from './env.validation';
|
||||
|
||||
@Global()
|
||||
@Module({
|
||||
imports: [
|
||||
ConfigModule.forRoot({
|
||||
isGlobal: true,
|
||||
load: [databaseConfig],
|
||||
validate: validateEnvironment,
|
||||
envFilePath: ['.env.local', '.env'],
|
||||
}),
|
||||
],
|
||||
exports: [ConfigModule],
|
||||
})
|
||||
export class AppConfigModule {}
|
||||
34
src/config/database.config.ts
Normal file
34
src/config/database.config.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { registerAs } from '@nestjs/config';
|
||||
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
|
||||
import { DataSource, DataSourceOptions } from 'typeorm';
|
||||
|
||||
export const databaseConfig = registerAs(
|
||||
'database',
|
||||
(): TypeOrmModuleOptions => ({
|
||||
type: 'mysql',
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
port: parseInt(process.env.DB_PORT || '3306', 10),
|
||||
username: process.env.DB_USERNAME || 'meme_user',
|
||||
password: process.env.DB_PASSWORD || '',
|
||||
database: process.env.DB_DATABASE || 'meme_mind',
|
||||
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
|
||||
synchronize: process.env.NODE_ENV !== 'production',
|
||||
logging: process.env.NODE_ENV !== 'production',
|
||||
autoLoadEntities: true,
|
||||
}),
|
||||
);
|
||||
|
||||
export const dataSourceOptions: DataSourceOptions = {
|
||||
type: 'mysql',
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
port: parseInt(process.env.DB_PORT || '3306', 10),
|
||||
username: process.env.DB_USERNAME || 'meme_user',
|
||||
password: process.env.DB_PASSWORD || '',
|
||||
database: process.env.DB_DATABASE || 'meme_mind',
|
||||
entities: ['dist/**/*.entity{.ts,.js}'],
|
||||
synchronize: false,
|
||||
logging: true,
|
||||
};
|
||||
|
||||
const dataSource = new DataSource(dataSourceOptions);
|
||||
export default dataSource;
|
||||
56
src/config/env.validation.ts
Normal file
56
src/config/env.validation.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { plainToInstance } from 'class-transformer';
|
||||
import {
|
||||
IsEnum,
|
||||
IsNumber,
|
||||
IsString,
|
||||
validateSync,
|
||||
} from 'class-validator';
|
||||
|
||||
enum Environment {
|
||||
Development = 'development',
|
||||
Production = 'production',
|
||||
Test = 'test',
|
||||
}
|
||||
|
||||
class EnvironmentVariables {
|
||||
@IsEnum(Environment)
|
||||
NODE_ENV: Environment = Environment.Development;
|
||||
|
||||
@IsNumber()
|
||||
PORT: number = 3000;
|
||||
|
||||
@IsString()
|
||||
DB_HOST: string = 'localhost';
|
||||
|
||||
@IsNumber()
|
||||
DB_PORT: number = 3306;
|
||||
|
||||
@IsString()
|
||||
DB_USERNAME: string = 'meme_user';
|
||||
|
||||
@IsString()
|
||||
DB_PASSWORD: string = '';
|
||||
|
||||
@IsString()
|
||||
DB_DATABASE: string = 'meme_mind';
|
||||
}
|
||||
|
||||
export function validateEnvironment(
|
||||
config: Record<string, unknown>,
|
||||
): EnvironmentVariables {
|
||||
const validatedConfig = plainToInstance(EnvironmentVariables, config, {
|
||||
enableImplicitConversion: true,
|
||||
});
|
||||
|
||||
const errors = validateSync(validatedConfig, {
|
||||
skipMissingProperties: false,
|
||||
});
|
||||
|
||||
if (errors.length > 0) {
|
||||
throw new Error(
|
||||
`Environment validation failed: ${errors.map((e) => e.toString()).join(', ')}`,
|
||||
);
|
||||
}
|
||||
|
||||
return validatedConfig;
|
||||
}
|
||||
Reference in New Issue
Block a user