fix(sync): re-upload correto quando arquivo foi deletado do storage
continuous-integration/webhook Deploy concluído (VPS4)

- storage.js: adiciona fileExists() com HeadObject (sem baixar o arquivo)
- check-image-exists: verifica existência física no storage, não só no banco;
  se registro existe mas arquivo não, apaga o registro órfão e retorna exists=false
- send-image: mesma lógica — registro órfão é removido e re-upload prossegue
- Remove migrate-to-wasabi.js do repositório

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Deploy Agent
2026-05-31 02:33:33 +02:00
parent 91881ab7a3
commit 7cdd82eeb4
3 changed files with 78 additions and 119 deletions
+35 -21
View File
@@ -877,26 +877,30 @@ io.on('connection', (socket) => {
throw new Error('Metadata incompleta. fileName é obrigatório.');
}
// Verificar se a imagem já foi inserida no banco
// Verificar se a imagem já existe no banco E no storage
const existing = await db.get(
"SELECT id, filename FROM images WHERE original_filename = $1 AND enabled = 1 LIMIT 1",
"SELECT id, filename, clinic_name, client_name, patient_name FROM images WHERE original_filename = $1 AND enabled = 1 LIMIT 1",
[data.metadata.fileName]
);
if (existing) {
console.log(`⚠️ Imagem ${data.metadata.fileName} já existe no servidor (ID: ${existing.id}). Ignorando upload.`);
const ackData = {
success: true,
imageId: existing.id,
message: 'Imagem já existe no servidor',
filename: existing.filename,
originalFilename: data.metadata.fileName,
savedAt: new Date().toISOString()
};
socket.emit('image-received', ackData);
if (typeof callback === 'function') {
callback(ackData);
const physicallyExists = await storage.fileExists(existing.filename, existing.clinic_name, existing.client_name, existing.patient_name);
if (physicallyExists) {
console.log(`⚠️ Imagem ${data.metadata.fileName} já existe no servidor (ID: ${existing.id}). Ignorando upload.`);
const ackData = {
success: true,
imageId: existing.id,
message: 'Imagem já existe no servidor',
filename: existing.filename,
originalFilename: data.metadata.fileName,
savedAt: new Date().toISOString()
};
socket.emit('image-received', ackData);
if (typeof callback === 'function') callback(ackData);
return;
}
return;
// Registro órfão (arquivo deletado do storage) — remove para re-upload limpo
console.log(`🔄 Registro órfão encontrado para ${data.metadata.fileName} (ID: ${existing.id}). Removendo para re-upload.`);
await db.run('DELETE FROM images WHERE id = $1', [existing.id]);
}
// Decodificar imagem base64
@@ -1125,18 +1129,28 @@ io.on('connection', (socket) => {
if (typeof callback === 'function') callback({ success: false, error: 'fileName é obrigatório' });
return;
}
const existing = await db.get(
"SELECT id, filename FROM images WHERE original_filename = $1 AND enabled = 1 LIMIT 1",
"SELECT id, filename, clinic_name, client_name, patient_name FROM images WHERE original_filename = $1 AND enabled = 1 LIMIT 1",
[data.fileName]
);
// Registro no banco só conta se o arquivo realmente existir no storage
let physicallyExists = false;
if (existing) {
physicallyExists = await storage.fileExists(existing.filename, existing.clinic_name, existing.client_name, existing.patient_name);
if (!physicallyExists) {
// Apaga o registro órfão para o re-upload criar um novo
await db.run('DELETE FROM images WHERE id = $1', [existing.id]);
}
}
if (typeof callback === 'function') {
callback({
success: true,
exists: !!existing,
imageId: existing ? existing.id : null,
filename: existing ? existing.filename : null
exists: physicallyExists,
imageId: physicallyExists ? existing.id : null,
filename: physicallyExists ? existing.filename : null
});
}
} catch (error) {