const fs = require('fs'); const path = require('path'); const sharp = require('sharp'); const db = require('./database'); const storage = require('./storage'); require('dotenv').config(); async function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function run() { try { console.log("⏳ Iniciando o banco de dados..."); // Hack para inicializar banco usando código do projeto db.initDatabase = require('./database').initDatabase || (async () => { const { Pool } = require('pg'); const pool = new Pool({ host: process.env.DB_HOST || '10.99.0.3', port: process.env.DB_PORT || 5432, user: process.env.DB_USER || 'postgres', database: process.env.DB_NAME || 'dental_images', password: process.env.DB_PASSWORD }); db.all = async (query, params) => { const r = await pool.query(query, params); return r.rows; }; db.run = async (query, params) => { await pool.query(query, params); return {}; }; }); await db.initDatabase(); await storage.loadConfigFromDb(); console.log("🔍 Buscando imagens sem thumbnail..."); const images = await db.all("SELECT * FROM images WHERE thumb_filename IS NULL AND filename LIKE '%.png'"); console.log(`Encontradas ${images.length} imagens para processar.`); for (let i = 0; i < images.length; i++) { const img = images[i]; console.log(`[${i+1}/${images.length}] Processando ${img.filename}...`); try { // Tenta pegar o buffer (S3 ou local) const buffer = await storage.getImageBuffer(img.filename, img.client_name, img.patient_name, false); if (!buffer) { console.log(`⚠️ Imagem não encontrada no storage: ${img.filename}`); continue; } // Gera o thumbnail usando Sharp (já está no package.json do servidor) const thumbBuffer = await sharp(buffer) .resize(300, 300, { fit: 'inside' }) .jpeg({ quality: 80 }) .toBuffer(); const thumbFilename = img.filename.replace('.png', '_thumb.jpg'); // Salva o thumbnail no storage await storage.saveImage(thumbFilename, thumbBuffer, img.client_name, img.patient_name, false); // Atualiza o banco de dados await db.run("UPDATE images SET thumb_filename = $1 WHERE id = $2", [thumbFilename, img.id]); console.log(`✅ Thumbnail gerado: ${thumbFilename}`); // Pequena pausa para não estourar memória / limite da API da AWS await delay(200); } catch (err) { console.error(`❌ Erro ao processar ${img.filename}: ${err.message}`); } } console.log("🎉 Concluído!"); process.exit(0); } catch (err) { console.error("❌ Falha fatal:", err); process.exit(1); } } run();