Move upload caps into validation config env vars.

Replace MAX_IMAGES_PER_UPLOAD with VALIDATION_UPLOAD_* limits mirrored on the frontend VITE_* names.
This commit is contained in:
2026-10-07 00:36:10 +02:00
parent 1f47cf051f
commit 493843cc42
6 changed files with 29 additions and 9 deletions
+5 -2
View File
@@ -18,7 +18,6 @@ NODE_ENV=development
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173 CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
MAX_IMAGES_PER_UPLOAD=10
MULTER_MAX_FILE_BYTES=10485760 MULTER_MAX_FILE_BYTES=10485760
ALTCHA_ENABLED=true ALTCHA_ENABLED=true
@@ -32,7 +31,11 @@ THROTTLE_LIMIT=1000
THROTTLE_UPLOAD_TTL_MS=60000 THROTTLE_UPLOAD_TTL_MS=60000
THROTTLE_UPLOAD_LIMIT=20 THROTTLE_UPLOAD_LIMIT=20
VALIDATION_UPLOAD_MAX_IMAGES_PER_UPLOAD=10
VALIDATION_UPLOAD_MAX_VIEWS_MAX=1000000
VITE_API_BASE_URL=http://localhost:3000/api VITE_API_BASE_URL=http://localhost:3000/api
VITE_CLEARNET_DOMAIN=localhost:5173 VITE_CLEARNET_DOMAIN=localhost:5173
VITE_ONION_HOSTNAME= VITE_ONION_HOSTNAME=
VITE_MAX_IMAGES_PER_UPLOAD=10 VITE_VALIDATION_UPLOAD_MAX_IMAGES_PER_UPLOAD=10
VITE_VALIDATION_UPLOAD_MAX_VIEWS_MAX=1000000
+4
View File
@@ -49,6 +49,10 @@ export const getAppConfig = (): AppConfig => {
uploadThrottle: { uploadThrottle: {
ttlMs: envInt('THROTTLE_UPLOAD_TTL_MS'), ttlMs: envInt('THROTTLE_UPLOAD_TTL_MS'),
limit: envInt('THROTTLE_UPLOAD_LIMIT') limit: envInt('THROTTLE_UPLOAD_LIMIT')
},
validation: {
maxImagesPerUpload: envInt('VALIDATION_UPLOAD_MAX_IMAGES_PER_UPLOAD'),
uploadMaxViewsMax: envInt('VALIDATION_UPLOAD_MAX_VIEWS_MAX')
} }
}; };
}; };
+2 -1
View File
@@ -11,7 +11,7 @@ const validConfig = (overrides: Record<string, unknown> = {}): Record<string, un
POSTGRES_PORT: 5432, POSTGRES_PORT: 5432,
POSTGRES_MIGRATIONS_RUN: 'false', POSTGRES_MIGRATIONS_RUN: 'false',
CORS_ORIGINS: 'http://localhost:5173', CORS_ORIGINS: 'http://localhost:5173',
MAX_IMAGES_PER_UPLOAD: 10, VALIDATION_UPLOAD_MAX_IMAGES_PER_UPLOAD: 10,
MULTER_MAX_FILE_BYTES: 10485760, MULTER_MAX_FILE_BYTES: 10485760,
ALTCHA_ENABLED: 'true', ALTCHA_ENABLED: 'true',
ALTCHA_HMAC_KEY: 'secret', ALTCHA_HMAC_KEY: 'secret',
@@ -21,6 +21,7 @@ const validConfig = (overrides: Record<string, unknown> = {}): Record<string, un
THROTTLE_LIMIT: 1000, THROTTLE_LIMIT: 1000,
THROTTLE_UPLOAD_TTL_MS: 60000, THROTTLE_UPLOAD_TTL_MS: 60000,
THROTTLE_UPLOAD_LIMIT: 20, THROTTLE_UPLOAD_LIMIT: 20,
VALIDATION_UPLOAD_MAX_VIEWS_MAX: 1_000_000,
...overrides ...overrides
}); });
+12 -6
View File
@@ -45,12 +45,6 @@ class EnvironmentVariables {
@IsString() @IsString()
CORS_ORIGINS: string; CORS_ORIGINS: string;
@IsNotEmpty()
@IsNumber()
@Min(1)
@Max(100)
MAX_IMAGES_PER_UPLOAD: number;
@IsNotEmpty() @IsNotEmpty()
@IsNumber() @IsNumber()
@Min(1) @Min(1)
@@ -100,6 +94,18 @@ class EnvironmentVariables {
@Min(1) @Min(1)
@Max(10_000) @Max(10_000)
THROTTLE_UPLOAD_LIMIT: number; THROTTLE_UPLOAD_LIMIT: number;
@IsNotEmpty()
@IsNumber()
@Min(1)
@Max(100)
VALIDATION_UPLOAD_MAX_IMAGES_PER_UPLOAD: number;
@IsNotEmpty()
@IsNumber()
@Min(1)
@Max(10_000_000)
VALIDATION_UPLOAD_MAX_VIEWS_MAX: number;
} }
export const validate = (config: Record<string, unknown>) => { export const validate = (config: Record<string, unknown>) => {
+2
View File
@@ -1,5 +1,6 @@
import { NodeEnv } from './NodeEnv'; import { NodeEnv } from './NodeEnv';
import { ThrottleConfig } from './ThrottleConfig'; import { ThrottleConfig } from './ThrottleConfig';
import { ValidationConfig } from './ValidationConfig';
export type AppConfig = { export type AppConfig = {
port: number; port: number;
@@ -7,4 +8,5 @@ export type AppConfig = {
corsOrigins: string[]; corsOrigins: string[];
throttle: ThrottleConfig; throttle: ThrottleConfig;
uploadThrottle: ThrottleConfig; uploadThrottle: ThrottleConfig;
validation: ValidationConfig;
}; };
+4
View File
@@ -0,0 +1,4 @@
export type ValidationConfig = {
maxImagesPerUpload: number;
uploadMaxViewsMax: number;
};