Files
parsshop-back/src/config/env.validation.ts
2026-03-29 17:32:57 +03:00

117 lines
1.9 KiB
TypeScript

import { plainToInstance } from 'class-transformer';
import { IsNotEmpty, IsNumberString, IsOptional, IsString, validateSync } from 'class-validator';
class EnvironmentVariables {
@IsOptional()
@IsNumberString()
PORT?: string;
@IsOptional()
@IsString()
NODE_ENV?: string;
@IsOptional()
@IsString()
CORS_ORIGINS?: string;
@IsNotEmpty()
@IsString()
DB_URL!: string;
@IsOptional()
@IsString()
DB_SSL?: string;
@IsOptional()
@IsString()
REDIS_URL?: string;
@IsNotEmpty()
@IsString()
JWT_SECRET!: string;
@IsOptional()
@IsString()
JWT_ACCESS_TTL?: string;
@IsOptional()
@IsString()
JWT_REFRESH_TTL?: string;
@IsNotEmpty()
@IsString()
SMS_API_KEY!: string;
@IsOptional()
@IsString()
SMS_WSDL_URL?: string;
@IsOptional()
@IsString()
SMS_USERNAME?: string;
@IsOptional()
@IsString()
SMS_PASSWORD?: string;
@IsOptional()
@IsString()
SMS_NUMBER?: string;
@IsOptional()
@IsNumberString()
OTP_TTL_SECONDS?: string;
@IsOptional()
@IsString()
MINIO_ENDPOINT?: string;
@IsOptional()
@IsNumberString()
MINIO_PORT?: string;
@IsOptional()
@IsString()
MINIO_USE_SSL?: string;
@IsOptional()
@IsString()
MINIO_ACCESS_KEY?: string;
@IsOptional()
@IsString()
MINIO_SECRET_KEY?: string;
@IsOptional()
@IsString()
MINIO_BUCKET?: string;
@IsOptional()
@IsString()
MINIO_PUBLIC_BUCKET?: string;
@IsOptional()
@IsString()
MINIO_PRIVATE_BUCKET?: string;
@IsOptional()
@IsString()
MINIO_PUBLIC_URL?: string;
}
export function validateEnv(config: Record<string, unknown>) {
const validatedConfig = plainToInstance(EnvironmentVariables, config, {
enableImplicitConversion: true,
});
const errors = validateSync(validatedConfig, {
skipMissingProperties: false,
});
if (errors.length > 0) {
throw new Error(errors.toString());
}
return validatedConfig;
}