From 0063b23c45138942ba830ca597285b7904b4c048 Mon Sep 17 00:00:00 2001 From: VPS 4 Builder Date: Sun, 31 May 2026 06:52:49 +0200 Subject: [PATCH] =?UTF-8?q?feat(client):=20plan-b=20=E2=80=94=20handler=20?= =?UTF-8?q?reupload-files=20para=20imagens=20ausentes=20no=20Wasabi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- client-monitor.js | 43 +++++++++++++++++++++++++++++++++++++++++++ index.js | 8 ++++++++ 2 files changed, 51 insertions(+) diff --git a/client-monitor.js b/client-monitor.js index f31fae9..da29a4f 100644 --- a/client-monitor.js +++ b/client-monitor.js @@ -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(); diff --git a/index.js b/index.js index 449eb73..16220df 100644 --- a/index.js +++ b/index.js @@ -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' + }); + } } });