This commit is contained in:
richarjiang
2026-03-15 11:35:39 +08:00
commit 6413d4f34c
27 changed files with 7589 additions and 0 deletions

View 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 {}

View 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;

View 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;
}