From 822cb32671f37cfaa425ca73637163c15ef7a0f4 Mon Sep 17 00:00:00 2001 From: fenos Date: Wed, 3 Jan 2024 09:16:04 +0000 Subject: [PATCH] feat: optional file size limit on standard upload --- src/config.ts | 4 ++++ src/storage/uploader.ts | 24 ++++++++++++++++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/config.ts b/src/config.ts index 47e3e987..bef69508 100644 --- a/src/config.ts +++ b/src/config.ts @@ -11,6 +11,7 @@ type StorageConfigType = { anonKey: string encryptionKey: string fileSizeLimit: number + fileSizeLimitStandardUpload?: number fileStoragePath?: string globalS3Protocol: 'http' | 'https' globalS3MaxSockets?: number @@ -109,6 +110,9 @@ export function getConfig(): StorageConfigType { anonKey: getOptionalIfMultitenantConfigFromEnv('ANON_KEY') || '', encryptionKey: getOptionalConfigFromEnv('ENCRYPTION_KEY') || '', fileSizeLimit: Number(getConfigFromEnv('FILE_SIZE_LIMIT')), + fileSizeLimitStandardUpload: parseInt( + getOptionalConfigFromEnv('FILE_SIZE_LIMIT_STANDARD_UPLOAD') || '0' + ), fileStoragePath: getOptionalConfigFromEnv('FILE_STORAGE_BACKEND_PATH'), globalS3MaxSockets: parseInt(getOptionalConfigFromEnv('GLOBAL_S3_MAX_SOCKETS') || '200', 10), globalS3Protocol: (getOptionalConfigFromEnv('GLOBAL_S3_PROTOCOL') || 'https') as diff --git a/src/storage/uploader.ts b/src/storage/uploader.ts index 5f64b437..2f13eb31 100644 --- a/src/storage/uploader.ts +++ b/src/storage/uploader.ts @@ -13,7 +13,7 @@ interface UploaderOptions extends UploadObjectOptions { allowedMimeTypes?: string[] | null } -const { globalS3Bucket } = getConfig() +const { globalS3Bucket, fileSizeLimitStandardUpload } = getConfig() export interface UploadObjectOptions { bucketId: string @@ -247,13 +247,7 @@ export class Uploader { options?: Pick ) { const contentType = request.headers['content-type'] - let fileSizeLimit = await getFileSizeLimit(request.tenantId) - - if (typeof options?.fileSizeLimit === 'number') { - if (options.fileSizeLimit <= fileSizeLimit) { - fileSizeLimit = options.fileSizeLimit - } - } + const fileSizeLimit = await this.getFileSizeLimit(request.tenantId, options?.fileSizeLimit) let body: NodeJS.ReadableStream let mimeType: string @@ -297,4 +291,18 @@ export class Uploader { isTruncated, } } + + protected async getFileSizeLimit(tenantId: string, bucketSizeLimit?: number | null) { + let globalFileSizeLimit = await getFileSizeLimit(tenantId) + + if (typeof bucketSizeLimit === 'number') { + globalFileSizeLimit = Math.min(bucketSizeLimit, globalFileSizeLimit) + } + + if (fileSizeLimitStandardUpload && fileSizeLimitStandardUpload > 0) { + globalFileSizeLimit = Math.min(fileSizeLimitStandardUpload, globalFileSizeLimit) + } + + return globalFileSizeLimit + } }