feat(client): plan-b — handler reupload-files para imagens ausentes no Wasabi
continuous-integration/webhook Falha no build do client (VPS4)
continuous-integration/webhook Falha no build do client (VPS4)
Quando o servidor não encontra nem thumb nem original no Wasabi, emite 'reupload-files' com a lista de original_filenames para o cliente. O cliente (client-monitor.js): - Ouve 'reupload-files' e para cada filename busca localmente em monitorPath - Remove do uploadedCache (força reenvio mesmo que já conste como enviado) - Chama sendImageToServer com bypassCache=true - Respeita isSendingPaused - Loga resultado (reenviados / não encontrados localmente) O processo Electron (index.js) exibe balão informativo quando o reenvio é solicitado, para o usuário saber que algo está acontecendo. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1098,6 +1098,49 @@ function connectToServer() {
|
||||
}
|
||||
});
|
||||
|
||||
// Plan B: servidor solicita reenvio de arquivos ausentes no Wasabi
|
||||
socket.on('reupload-files', async (data) => {
|
||||
const files = Array.isArray(data.files) ? data.files : [];
|
||||
if (files.length === 0) return;
|
||||
|
||||
addLog(`📥 [Plan B] Servidor solicitou reenvio de ${files.length} arquivo(s) ausente(s) no Wasabi.`);
|
||||
|
||||
// Notifica o processo Electron para exibir balão informativo
|
||||
if (process.send) {
|
||||
process.send({ event: 'reupload-requested', count: files.length });
|
||||
}
|
||||
|
||||
let reuploadado = 0;
|
||||
let naoEncontrado = 0;
|
||||
|
||||
for (const filename of files) {
|
||||
if (isSendingPaused) {
|
||||
addLog(`⏸️ [Plan B] Envio pausado — interrompendo reenvio. ${reuploadado} já reenviados.`);
|
||||
break;
|
||||
}
|
||||
|
||||
const filePath = path.join(config.monitorPath, filename);
|
||||
|
||||
if (!fs.existsSync(filePath)) {
|
||||
addLog(`⚠️ [Plan B] Arquivo não encontrado localmente: ${filename}`);
|
||||
naoEncontrado++;
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
addLog(`♻️ [Plan B] Reenviando: ${filename}`);
|
||||
// Remove do cache para forçar reenvio mesmo que já conste como enviado
|
||||
uploadedCache.delete(filename);
|
||||
await sendImageToServer(filePath, false, true); // bypassCache = true
|
||||
reuploadado++;
|
||||
} catch (e) {
|
||||
addLog(`❌ [Plan B] Falha ao reenviar ${filename}: ${e.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
addLog(`✅ [Plan B] Reenvio concluído: ${reuploadado} reenviado(s), ${naoEncontrado} não encontrado(s) localmente.`);
|
||||
});
|
||||
|
||||
socket.on('test-connection', (data) => {
|
||||
addLog(`🧪 Recebido teste de conexão do servidor. Test ID: ${data?.testId}`);
|
||||
const startTime = data?.timestamp || Date.now();
|
||||
|
||||
@@ -349,6 +349,14 @@ function startMonitorProcess() {
|
||||
iconType: 'error'
|
||||
});
|
||||
}
|
||||
} else if (message && message.event === 'reupload-requested') {
|
||||
if (tray) {
|
||||
tray.displayBalloon({
|
||||
title: 'ScoreOdonto — Reenvio em Andamento',
|
||||
content: `O servidor solicitou o reenvio de ${message.count} imagem(ns) ausente(s) no armazenamento. Reenviando automaticamente...`,
|
||||
iconType: 'info'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user