- .gitea/workflows/build.yml: push->build rx-scoreodonto:<sha> no registry; tag->promote+deploy
- docker-compose.prod.yml: image do registry, APP_VERSION/GIT_COMMIT em runtime
- deploy-prod.sh: VPS1 pull + up --no-build (antigo vira deploy-prod-legado-webhook.sh)
- /api/health usa APP_VERSION (tag) com fallback version.txt; badge no canto
- webhook 9003 aposentado (gatilho agora e CI/tag)
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>
Backend:
- server.js: cron thumb-backfill a cada 10min com rastreio de estado
(lastRun, nextRun, running, lastResult). GET /api/cron/status e
POST /api/cron/run/:key para consulta e disparo manual via painel.
- routes/images.js: PUT /api/images/patients/:name — edita patient_name,
doctor e remark em todas as imagens do paciente de uma vez.
Frontend:
- PatientsPage.jsx (/patients): tabela com colunas Nome (+ miniatura),
Dentista, Imagens, Última atualização, Observações, Ações. Suporta
busca, paginação infinita, editar e excluir por linha.
- SettingsPage.jsx (/settings): seção de Cron Jobs com status, resultado
e botão "Executar agora"; seção de informações do servidor.
- EditPatientModal.jsx: edita nome, dentista e observações do paciente.
- Sidebar.jsx: add "Pacientes" (todos usuários) e "Configurações" (admin).
- App.jsx: rotas /patients (protegida) e /settings (admin).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>