fix(client): notificação Wasabi + ordem de envio mais recente primeiro

Item 2 — Notificação de erro do Wasabi:
- client-monitor.js: notifyWasabiError() envia evento IPC 'wasabi-error'
  ao processo Electron em dois cenários: falha no Direct Upload e Wasabi
  indisponível no servidor. Throttle de 60s para não inundar o usuário.
- index.js: trata 'wasabi-error' no handler IPC do monitorProcess e exibe
  tray.displayBalloon com iconType 'error'.

Item 5 — Ordem de envio (mais novas primeiro):
- executarSincronizacaoLocal: após filtrar imagens, ordena por mtime DESC
  antes de enfileirar — dentista recebe primeiro as imagens do atendimento
  atual em vez de receber em ordem arbitrária do filesystem.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-05-31 05:12:07 +02:00
parent 74ecdc1c0c
commit ff3b4e5934
2 changed files with 28 additions and 1 deletions
+20 -1
View File
@@ -1157,7 +1157,13 @@ async function executarSincronizacaoLocal() {
try {
const arquivos = fs.readdirSync(pastaImagensSensor);
const imagens = arquivos.filter(file => /\.(png|jpg|jpeg)$/i.test(file));
// Ordenar da mais recente para a mais antiga (mtime DESC) para que o
// dentista receba primeiro as imagens do atendimento atual.
const imagens = arquivos
.filter(file => /\.(png|jpg|jpeg)$/i.test(file))
.map(file => ({ file, mtime: fs.statSync(path.join(pastaImagensSensor, file)).mtime.getTime() }))
.sort((a, b) => b.mtime - a.mtime)
.map(({ file }) => file);
addLog(`🔎 Encontradas ${imagens.length} imagens locais no total. Verificando pendências com o servidor...`);
let processadas = 0;
@@ -1301,6 +1307,17 @@ function lookupPatientInfo(fileName) {
return null;
}
// Notifica o processo Electron (index.js) de erro no Wasabi via IPC.
// Throttle de 60s para não inundar o usuário num backlog grande.
let lastWasabiErrorNotifyAt = 0;
function notifyWasabiError(message) {
if (!process.send) return;
const now = Date.now();
if (now - lastWasabiErrorNotifyAt < 60000) return;
lastWasabiErrorNotifyAt = now;
process.send({ event: 'wasabi-error', message });
}
// Enviar imagem para o servidor via Socket.IO e aguardar confirmação
function sendImageToServer(filePath, isBacklog, bypassCache = false) {
return new Promise(async (resolve, reject) => {
@@ -1440,10 +1457,12 @@ function sendImageToServer(filePath, isBacklog, bypassCache = false) {
} catch (uploadErr) {
addLog(`❌ Falha no Direct Upload: ${uploadErr.message}. Tentando via VPS...`);
notifyWasabiError(`Falha no upload direto ao Wasabi: ${uploadErr.message}. Usando envio via VPS como alternativa.`);
fallbackUpload();
}
} else {
addLog(`️ Wasabi não disponível no servidor. Usando envio padrão via VPS.`);
notifyWasabiError(`Wasabi indisponível no servidor. Imagens sendo enviadas via VPS (mais lento).`);
fallbackUpload();
}
});