This commit is contained in:
2023-06-12 20:01:07 +02:00
parent edc42e3750
commit 59b4eb582e
43 changed files with 1799 additions and 245 deletions

View File

@@ -0,0 +1,54 @@
//базовые настройки env переменных
//по умолчанию переменные беруться сначала из ENV илм смотрят всегда на staging
//для подстановки локальных значений переменных использовать исключительно локальные env файлы env.development.local
//при необзодимости добавляем сюда нужные приложению переменные
import * as dotenv from 'dotenv';
dotenv.config();
export type EnvironmentVariable = { [key: string]: string | undefined };
export type EnvironmentsTypes =
| 'DEVELOPMENT'
| 'STAGING'
| 'PRODUCTION'
| 'TEST';
export class EnvironmentSettings {
constructor(private env: EnvironmentsTypes) {}
getEnv() {
return this.env;
}
isProduction() {
return this.env === 'PRODUCTION';
}
isStaging() {
return this.env === 'STAGING';
}
isDevelopment() {
return this.env === 'DEVELOPMENT';
}
isTesting() {
return this.env === 'TEST';
}
}
class AuthSettings {
public readonly BASE_AUTH_HEADER: string;
public readonly ACCESS_JWT_SECRET_KEY: string;
public readonly REFRESH_JWT_SECRET_KEY: string;
constructor(private envVariables: EnvironmentVariable) {
this.BASE_AUTH_HEADER =
envVariables.BASE_AUTH_HEADER || 'Basic YWRtaW46cXdlcnR5';
this.ACCESS_JWT_SECRET_KEY =
envVariables.ACCESS_JWT_SECRET_KEY || 'accessJwtSecret';
this.REFRESH_JWT_SECRET_KEY =
envVariables.REFRESH_JWT_SECRET_KEY || 'refreshJwtSecret';
}
}
export class AppSettings {
constructor(public env: EnvironmentSettings, public auth: AuthSettings) {}
}
const env = new EnvironmentSettings(
(process.env.NODE_ENV || 'DEVELOPMENT') as EnvironmentsTypes,
);
const auth = new AuthSettings(process.env);
export const appSettings = new AppSettings(env, auth);

View File

@@ -0,0 +1,16 @@
import { Global, Module } from '@nestjs/common';
import { appSettings, AppSettings } from './app-settings';
//главный config модуль для управления env переменными импортируется в app.module.ts глобально
//поскольку он глобальный то импортировать в каждый модуль его не надо
@Global()
@Module({
providers: [
{
provide: AppSettings.name,
useFactory: () => appSettings,
},
],
exports: [AppSettings.name],
})
export class ConfigModule {}

View File

@@ -0,0 +1,43 @@
import {
BadRequestException,
INestApplication,
ValidationPipe,
} from '@nestjs/common';
import { ValidationError } from 'class-validator';
export const validationErrorsMapper = {
mapValidationErrorArrayToValidationPipeErrorTypeArray(
errors: ValidationError[],
): ValidationPipeErrorType[] {
return errors.flatMap((error) => {
const constraints = error.constraints ?? [];
return Object.entries(constraints).map(([_, value]) => ({
field: error.property,
message: value,
}));
});
},
};
export function pipesSetup(app: INestApplication) {
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
transform: true,
stopAtFirstError: true,
exceptionFactory: (errors: ValidationError[]) => {
const err =
validationErrorsMapper.mapValidationErrorArrayToValidationPipeErrorTypeArray(
errors,
);
throw new BadRequestException(err);
},
}),
);
}
export type ValidationPipeErrorType = {
field: string;
message: string;
};