back: validation d'env, transaction setCurrent, fix N+1 catégories, logging
- ConfigModule.forRoot({ validate }) : schéma class-validator des variables
d'env, l'app refuse de démarrer si une var manque/mal typée ; suppression
des fallbacks de credentials DB (getOrThrow)
- setCurrent() enveloppé dans une transaction (plus de fenêtre incohérente
sur isCurrent entre les 2 updates)
- browse() : compteurs de toutes les catégories en 2 requêtes + calcul en
mémoire au lieu d'un N+1 récursif par enfant
- console.* -> Logger Nest partout (apis, uploads, seeder, bootstrap) ;
.catch(console.error) -> logger.error avec contexte
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
76
back/src/config/env.validation.ts
Normal file
76
back/src/config/env.validation.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
import { plainToInstance, Type } from 'class-transformer';
|
||||
import {
|
||||
IsEnum,
|
||||
IsInt,
|
||||
IsNotEmpty,
|
||||
IsOptional,
|
||||
IsString,
|
||||
Max,
|
||||
Min,
|
||||
validateSync,
|
||||
} from 'class-validator';
|
||||
|
||||
export enum NodeEnv {
|
||||
Development = 'development',
|
||||
Production = 'production',
|
||||
Test = 'test',
|
||||
}
|
||||
|
||||
/**
|
||||
* Schéma des variables d'environnement. Validé au démarrage via `validateEnv`
|
||||
* (branché sur `ConfigModule.forRoot({ validate })`) : l'app refuse de démarrer
|
||||
* si une variable requise manque ou est mal typée, plutôt que d'utiliser
|
||||
* silencieusement des valeurs par défaut (ex. credentials DB).
|
||||
*/
|
||||
export class EnvironmentVariables {
|
||||
@IsEnum(NodeEnv)
|
||||
@IsOptional()
|
||||
NODE_ENV: NodeEnv = NodeEnv.Development;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
DATABASE_HOST!: string;
|
||||
|
||||
@Type(() => Number)
|
||||
@IsInt()
|
||||
@Min(1)
|
||||
@Max(65535)
|
||||
DATABASE_PORT!: number;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
DATABASE_USER!: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
DATABASE_PASSWORD!: string;
|
||||
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
DATABASE_NAME!: string;
|
||||
|
||||
@Type(() => Number)
|
||||
@IsInt()
|
||||
@Min(1)
|
||||
@Max(65535)
|
||||
@IsOptional()
|
||||
PORT = 3000;
|
||||
|
||||
@IsString()
|
||||
@IsOptional()
|
||||
DOCS_OUTPUT_DIR?: string;
|
||||
}
|
||||
|
||||
export function validateEnv(config: Record<string, unknown>): EnvironmentVariables {
|
||||
const validated = plainToInstance(EnvironmentVariables, config, {
|
||||
enableImplicitConversion: true,
|
||||
});
|
||||
const errors = validateSync(validated, { skipMissingProperties: false });
|
||||
if (errors.length > 0) {
|
||||
const details = errors
|
||||
.map((e) => Object.values(e.constraints ?? {}).join(', '))
|
||||
.join('\n - ');
|
||||
throw new Error(`Configuration d'environnement invalide:\n - ${details}`);
|
||||
}
|
||||
return validated;
|
||||
}
|
||||
Reference in New Issue
Block a user