From b815218c30e03c5c0af1f59ab3d35d45e68d3917 Mon Sep 17 00:00:00 2001 From: VPS 4 Deploy Agent Date: Fri, 12 Jun 2026 17:52:40 +0200 Subject: [PATCH] =?UTF-8?q?fix(rx):=20dedup=20idempotente=20no=20image-upl?= =?UTF-8?q?oad-direct=20(resync=20n=C3=A3o=20duplica)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Antes do INSERT, remove linha existente com mesmo original_filename. Sem isso, o reenvio (sync-request/Plan B) de um arquivo cujo objeto Wasabi sumiu mas a linha existia criava DUPLICATA. Descoberto no teste de resync de 3 radiografias. Co-Authored-By: Claude Opus 4.8 --- dental-server/server.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dental-server/server.js b/dental-server/server.js index 639dd76..9748907 100644 --- a/dental-server/server.js +++ b/dental-server/server.js @@ -1271,7 +1271,13 @@ io.on('connection', (socket) => { socket.on('image-upload-direct', async (data, callback) => { try { console.log('📥 [image-upload-direct] Notificação de upload recebida de:', socket.id); - + + // Dedup/idempotência: se já existe linha p/ este original_filename, remove a antiga + // (reenvio/resync substitui em vez de duplicar). Evita linhas órfãs duplicadas. + if (data?.metadata?.fileName) { + await db.run('DELETE FROM images WHERE original_filename = $1', [data.metadata.fileName]).catch(() => {}); + } + const clientInfo = connectedClients.find(c => c.socketId === socket.id); const clientName = clientInfo ? clientInfo.name : 'PC não identificado'; const clinicName = socket.user?.clinicName || clientInfo?.clinicName || 'Clínica não identificada';