Causa raiz: request-presigned-urls usava firstName/lastName para montar
o patientName do caminho no Wasabi, mas o client envia apenas name.
Resultado: toda imagem era salva em '.../Desconhecido/arquivo.png' no
Wasabi, mas o banco guardava o nome real do paciente — na recuperação,
a key ficava diferente e resultava em NoSuchKey → 500.
Correções:
1. server.js: getImageBufferWithFallback() — tenta o path correto (nome
real) e, se falhar, tenta o path legado 'Desconhecido'. Usado tanto
para ler thumb existente quanto para gerar do original.
2. server.js: patientName corrigido em send-image e request-presigned-urls
para usar data.patientData.name (o campo que o client realmente envia),
garantindo consistência entre Wasabi e banco em novos uploads.
3. routes/images.js: runThumbBackfill agora usa storage.getImageBuffer
com fallback 'Desconhecido' em vez de leitura apenas do disco local
— o boot backfill passa a funcionar para imagens no Wasabi.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Item 1 — Clínica antes do PC:
- public_legacy/clients.html: nome exibido como "Clínica — PC" na lista
de clientes identificados no painel de monitoramento.
- public_legacy/app.js: displayName dos clientes ativos agora inclui
clinicName como prefixo ("Clínica — PC"); propagado automaticamente
para o dropdown de filtro e demais usos que iteram clientsList.
Card de sincronização de dispositivos atualizado da mesma forma.
Clínicas sem identificação ("Clínica não identificada") exibem só o
nome do PC (sem prefixo vazio).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- Adiciona coluna clinic_name em images (ALTER TABLE IF NOT EXISTS)
- Todas as funções de storage recebem clinicName como parâmetro: saveImage,
getImageBuffer, getImageUrl, deleteImage, getDownloadPresignedUrl, getUploadPresignedUrl
- Chave Wasabi passa de pc_name/patient/arquivo → clinic_name/pc_name/patient/arquivo
- server.js: usa socket.user.clinicName (preenchido via machine_token auth do DB) como
fonte primária do nome da clínica nos 3 handlers de upload e na rota thumbnail
- Todos os INSERTs em images passam a gravar clinic_name
- Corrige bug oculto: wipe de clínica agora apaga o prefixo correto no Wasabi
- Scripts utilitários atualizados: backfill-wasabi-thumbs, recreate-all-thumbs, migrate-to-wasabi
- client-monitor.js: envia clinicName no client-identify (fallback para clientes legados)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Form não enviava password → servidor retornava 400 em todo cadastro
- Adicionado input password no modal de cadastro
- pc_name tornado opcional no servidor (já era opcional no UI)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Troca nome do sistema de "RF Dental" para "Score Client" em toda UI (título, sidebar, login, página de download)
- Corrige link de download: era hardcoded /updates/RFDental-Setup.exe (inexistente), agora lê o nome real do arquivo a partir do latest.yml e constrói URL versionada dinamicamente
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- DELETE /admin/clinics/:id/wipe: apaga images/gto_images do banco (WHERE client_name),
lista e deleta em batch todos os objetos Wasabi com prefixo 'clinic_name/',
e remove o registro do dispositivo
- UI: botão 'Limpar dados' (🧹) separado do 🗑️ (remove só o cadastro),
modal com aviso, confirmação e log da operação
- Sidebar: remove link 'Zerar Sistema'
Ao clicar em Orientar, primeiro mostra 4 rotações da imagem para escolher a
orientação grossa; ao clicar numa, abre o ajuste fino (escolhida + original)
com botão para voltar. Rotação salva = orientação escolhida + ajuste fino.
O endpoint /api/images/:id/thumbnail retornava JSON {url}, mas o React aponta
<img src> direto para ele, causando placeholders cinza (sem erro no devtools).
Agora serve image/jpeg diretamente. Quando thumb_filename é null, puxa a original,
gera a thumb na hora, serve imediatamente e faz backfill no Wasabi + atualiza o banco.