const ALLOWED_MIME_TYPES = new Set([ 'image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', ]); const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB export function validateImage(req, res, next) { const file = req.file; if (!file) { return res.status(400).json({ ok: false, error: 'BAD_REQUEST', message: 'Файл не предоставлен', }); } if (!ALLOWED_MIME_TYPES.has(file.mimetype)) { return res.status(400).json({ ok: false, error: 'INVALID_FILE_TYPE', message: `Недопустимый тип файла. Разрешены: JPEG, PNG, GIF, WebP`, }); } if (file.size > MAX_FILE_SIZE) { return res.status(400).json({ ok: false, error: 'FILE_TOO_LARGE', message: `Файл слишком большой. Максимум: ${MAX_FILE_SIZE / 1024 / 1024}MB`, }); } const filename = file.originalname || file.filename; const ext = filename.split('.').pop().toLowerCase(); const validExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp']; if (!validExtensions.includes(ext)) { return res.status(400).json({ ok: false, error: 'INVALID_EXTENSION', message: 'Недопустимое расширение файла', }); } next(); }