From dd0e5875514e70b5409ad5ba899c0b2cad3e384e Mon Sep 17 00:00:00 2001 From: Sidney Date: Sat, 18 Jul 2026 21:44:35 -0300 Subject: [PATCH] feat(pre-matricula): compress uploaded preview images using sharp to JPEG for WhatsApp --- manager/server.selfhosted.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/manager/server.selfhosted.js b/manager/server.selfhosted.js index 3d20070..6fb8644 100644 --- a/manager/server.selfhosted.js +++ b/manager/server.selfhosted.js @@ -4256,8 +4256,31 @@ async function startServer() { if (!req.file) { return res.status(400).json({ error: 'Nenhum arquivo enviado.' }); } - const fileName = `pre_${Date.now()}_${Math.random().toString(36).substring(7)}_${req.file.originalname.replace(/[^a-zA-Z0-9.-]/g, '_')}`; - const url = await uploadFile('prematriculas', fileName, req.file.buffer, req.file.mimetype); + + let fileBuffer = req.file.buffer; + let contentType = req.file.mimetype; + let fileName = req.file.originalname.replace(/[^a-zA-Z0-9.-]/g, '_'); + + // Se for uma imagem, compacta usando sharp e converte para JPEG para garantir compatibilidade com WhatsApp + if (contentType.startsWith('image/')) { + try { + fileBuffer = await sharp(req.file.buffer) + .resize(600, 600, { fit: 'inside', withoutEnlargement: true }) + .jpeg({ quality: 75, progressive: true }) + .toBuffer(); + contentType = 'image/jpeg'; + + // Garante que a extensão seja .jpg no final do nome + const lastDot = fileName.lastIndexOf('.'); + const baseName = lastDot !== -1 ? fileName.substring(0, lastDot) : fileName; + fileName = `${baseName}.jpg`; + } catch (sharpError) { + console.warn('[PreMatricula:Upload] Falha ao processar com sharp, enviando original:', sharpError.message); + } + } + + const finalFileName = `pre_${Date.now()}_${Math.random().toString(36).substring(7)}_${fileName}`; + const url = await uploadFile('prematriculas', finalFileName, fileBuffer, contentType); res.json({ url }); } catch (e) { console.error('[PreMatricula:Upload] Erro de upload:', e);