Hierarquia tenant_id (usuarios.id do dono) / clinica_id / pc / paciente, espelhando
o scoreodonto (conta multi-clínica planejada: um dono gerencia várias clínicas).
- Colunas tenant_id em clinics_devices e images (+índices); backfill device + 2776 imgs.
- Cadastro de device, socket (machine_token), JWT de client e uploads gravam tenant_id.
- Listagens (/images, /patients, /by-patient, /unique-clinics) filtram por tenant_id e/ou clinica_id.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- clinica_id (tenant do scoreodonto, clinicas.id) como eixo de isolamento em
clinics_devices e images (+índices); clinic_name vira rótulo legível.
- Cadastro de device, socket (machine_token) e uploads (direct + legado) gravam clinica_id.
- Listagens (/images, /patients, /by-patient, /unique-clinics) filtram por clinica_id.
- /clients: lista clientes Windows ativos (inclui autenticados sem client-identify),
tempo real + polling, exibe a clínica.
- send-image marcado como legado (client real usa Direct Upload).
Inclui trabalho de dev acumulado no working tree (não havia commits desde origin/main).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1. admin-clinics.js — bloqueia cadastro de clinic_name + pc_name duplicados:
Antes só validava email único. Agora verifica se já existe dispositivo com
a mesma combinação clinic_name + pc_name (case-insensitive). Sem isso, dois
PCs com mesmo nome na mesma clínica sobrescreveriam arquivos um do outro
no Wasabi (caminho idêntico).
2. admin-clinics.js — wipe usava client_name ao invés de clinic_name no banco:
'DELETE FROM images WHERE client_name = clinic_name' deletava o conjunto
errado de imagens (client_name é o nome do PC, não da clínica). Corrigido
para 'WHERE clinic_name = $1'. Wasabi continua usando sanitize(clinic_name)/
como prefixo (correto).
3. server.js — verificação de duplicata no connect incluía clinicName:
O check usava só clientName (pc_name), causando falso positivo: dois PCs
de clínicas diferentes com o mesmo nome (ex: ambos "PC-SALA-1") — o segundo
era desconectado. Agora verifica clinicName + clientName juntos.
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>
- 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'