Files
rx.scoreodonto.com/dental-server/scripts/generate-legacy-thumbs.js
T

79 lines
3.2 KiB
JavaScript

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();