const MB = 1024 * 1024 /** * Один файл изображения в админке: товары, галерея (`POST /api/admin/uploads`). * Должно совпадать с лимитом плагина multipart в `server/src/index.js`. */ export const ADMIN_UPLOAD_IMAGE_MAX_FILE_BYTES_DEFAULT = 20 * MB /** @deprecated используйте ADMIN_UPLOAD_IMAGE_MAX_FILE_BYTES_DEFAULT; оставлено для совместимости импортов */ export const PRODUCT_IMAGE_MAX_FILE_BYTES = ADMIN_UPLOAD_IMAGE_MAX_FILE_BYTES_DEFAULT /** Отзывы, чек оплаты и прочие загрузки (на файл). По умолчанию 2 МБ. */ export const OTHER_UPLOAD_MAX_FILE_BYTES = 2 * MB /** Лимит одного файла для админских изображений (байты). Env: `ADMIN_IMAGE_MAX_FILE_BYTES` или `PRODUCT_IMAGE_MAX_FILE_BYTES`. */ export function getProductImageMaxFileBytes() { const fromAdmin = Number(process.env.ADMIN_IMAGE_MAX_FILE_BYTES) const fromLegacy = Number(process.env.PRODUCT_IMAGE_MAX_FILE_BYTES) const n = Number.isFinite(fromAdmin) && fromAdmin > 0 ? fromAdmin : Number.isFinite(fromLegacy) && fromLegacy > 0 ? fromLegacy : NaN return Number.isFinite(n) && n > 0 ? Math.floor(n) : ADMIN_UPLOAD_IMAGE_MAX_FILE_BYTES_DEFAULT } export function getOtherUploadMaxFileBytes() { const n = Number(process.env.OTHER_UPLOAD_MAX_FILE_BYTES) return Number.isFinite(n) && n > 0 ? Math.floor(n) : OTHER_UPLOAD_MAX_FILE_BYTES } /** Лимит тела HTTP: до 10 фото товара за запрос + запас. */ export function getMaxUploadBodyBytes() { const n = Number(process.env.MAX_UPLOAD_BODY_BYTES) if (Number.isFinite(n) && n > 0) return Math.floor(n) return getProductImageMaxFileBytes() * 10 + MB } /** @param {unknown} error */ export function isMultipartFileTooLargeError(error) { if (!error || typeof error !== 'object') return false if (error.code === 'FST_REQ_FILE_TOO_LARGE') return true const msg = String(Reflect.get(error, 'message') ?? '') return /request file too large|file too large/i.test(msg) } /** @param {number} maxFileBytes */ export function formatFileTooLargeMessage(maxFileBytes) { const mb = Math.max(1, Math.round(maxFileBytes / MB)) return `Файл слишком большой (максимум ${mb} МБ).` }