feat: consolidate backend improvements, frontend UX fixes and Wasabi storage support
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
const db = require('./database');
|
||||
const storage = require('./storage');
|
||||
const imageProcessor = require('./image-processor');
|
||||
const fetch = require('node-fetch');
|
||||
|
||||
async function delay(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
async function run() {
|
||||
console.log('🚀 Iniciando compressão EXTREMA de TODAS as miniaturas...');
|
||||
|
||||
await db.initDatabase();
|
||||
await storage.loadConfigFromDb();
|
||||
|
||||
// Buscar todas as imagens que possuem miniatura
|
||||
const rows = await db.all(`
|
||||
SELECT id, filename, thumb_filename, client_name, patient_name
|
||||
FROM images
|
||||
WHERE thumb_filename IS NOT NULL AND enabled = 1
|
||||
`);
|
||||
|
||||
console.log(`🔍 Encontradas ${rows.length} imagens com miniatura para otimização.`);
|
||||
|
||||
let successCount = 0;
|
||||
let failCount = 0;
|
||||
|
||||
for (const row of rows) {
|
||||
console.log(`\n⚙️ Otimizando miniatura do ID ${row.id}: ${row.filename}`);
|
||||
|
||||
try {
|
||||
// 1. Obter URL de download do Wasabi (baixar a ORIGINAL, não a miniatura pesada)
|
||||
const url = await storage.getDownloadPresignedUrl(row.filename, row.client_name, row.patient_name);
|
||||
if (!url) {
|
||||
console.error(`❌ Não foi possível gerar URL para a imagem original ${row.filename}`);
|
||||
failCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// 2. Baixar a imagem original do Wasabi
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) {
|
||||
console.error(`❌ Erro ao baixar imagem original do Wasabi (${response.status})`);
|
||||
failCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const arrayBuffer = await response.arrayBuffer();
|
||||
const imageBuffer = Buffer.from(arrayBuffer);
|
||||
|
||||
// 3. Gerar miniatura (agora com JPEG super comprimido)
|
||||
const thumbBuffer = await imageProcessor.getThumbnail(imageBuffer, 400, 400);
|
||||
|
||||
// 4. Salvar miniatura substituindo a antiga
|
||||
await storage.saveImage(row.thumb_filename, thumbBuffer, row.client_name, row.patient_name, false);
|
||||
|
||||
console.log(`✅ Miniatura ultra-leve gerada e salva com sucesso para ID ${row.id} (${thumbBuffer.length} bytes)`);
|
||||
successCount++;
|
||||
|
||||
// Aguardar 500ms
|
||||
await delay(500);
|
||||
|
||||
} catch (err) {
|
||||
console.error(`❌ Erro ao processar ID ${row.id}:`, err.message);
|
||||
failCount++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n🎉 Processamento concluído!`);
|
||||
console.log(`✅ Sucessos: ${successCount}`);
|
||||
console.log(`❌ Falhas: ${failCount}`);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
run().catch(err => {
|
||||
console.error('❌ Erro crítico:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user