Commit Graph

39 Commits

Author SHA1 Message Date
VPS 4 Deploy Agent 31022c6a6f feat(rx): multi-tenant por clinica_id + página /clients de clientes ativos
- 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>
2026-06-12 16:17:09 +02:00
VPS 4 Deploy Agent 68dc2965da feat: add mobile API routes (download-all ZIP, upload-file multipart, auth/me, settings) 2026-06-03 17:02:07 +02:00
VPS 4 Deploy Agent 322fda9fff fix: update timeout warning message and missing labels
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-03 04:28:48 +02:00
VPS 4 Deploy Agent 5d2ba1a178 feat: Adicionado timeout assíncrono para ACK do Cliente Windows
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-02 20:55:21 +02:00
VPS 4 Deploy Agent 49c677b996 feat: implement remote CRUD for patients and update version
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-02 01:28:23 +02:00
VPS 4 Deploy Agent d86def2f12 feat(observation): separar observacao de imagem da observacao global do paciente (image_remark)
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-01 03:48:34 +02:00
VPS 4 Deploy Agent 0e71d2a88b feat(gtos): adicionar edicao inline de observacao de imagem na GTO
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-01 03:10:22 +02:00
VPS 4 Deploy Agent 2fd4ab91d4 fix(details): corrige erro de id null (RETURNING id) e implementa navegação baseada em rotas (/patient/:patientName)
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-01 02:45:06 +02:00
VPS 4 Deploy Agent 0d0ad5e4a6 fix: sidebar height scroll, saveTransform bypassing flip config and api gto insert syntax parse
continuous-integration/webhook Deploy concluído (VPS4)
2026-06-01 00:09:05 +02:00
VPS 4 Deploy Agent 35248fb27b fix(gtos): compatibilidade TransformModal com novo formato da API
continuous-integration/webhook Deploy concluído (VPS4)
A refatoração do GET /api/gtos para retornar { rows, total, pages }
quebrou o TransformModal que esperava um array direto.

Correções:
- routes/gtos.js: restaura suporte a ?patient=NOME (match exato) para
  o TransformModal continuar filtrando só as GTOs do paciente exibido,
  sem retornar resultados de outros pacientes via ILIKE.
- TransformModal.jsx: lê data.rows (novo formato) com fallback para
  array direto (compatibilidade durante transição).

As duas superfícies (TransformModal e GtosPage) agora usam a mesma
API, mesmos dados, sem lógica duplicada ou conflitante.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 16:25:37 +02:00
VPS 4 Deploy Agent f027842c76 feat(gtos): página de gerenciamento de GTOs com filtros e paginação
continuous-integration/webhook Deploy concluído (VPS4)
Backend:
- routes/gtos.js: GET /api/gtos reescrito com filtros (all/vinculada/enviada),
  busca ILIKE por patient_name e gto_number, paginação (page/limit),
  retorna { rows, total, pages } + thumb_url da primeira imagem vinculada.

Frontend:
- GtosPage.jsx (/gtos): cards de stats clicáveis (Todas/Vinculadas/Enviadas)
  com contadores em tempo real; tabela com colunas: thumb, número, paciente,
  qtd imagens (badge colorido), descrição, data, status, ações; paginação
  numérica; busca com debounce 350ms.
- StatusBadge: Pendente / Vinculada / Enviada com cores distintas.
- GtoDetailModal: info completa, grid de imagens vinculadas com thumb +
  botão desvincular, toggle enviada/pendente com feedback visual.
- CreateGtoModal: formulário com número, paciente, descrição.
- Sidebar: item GTOs (fa-file-medical) entre Pacientes e Novo Paciente.
- App.jsx: rota /gtos (ProtectedRoute).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 16:06:42 +02:00
VPS 4 Deploy Agent b6a1d3d68e fix(clinics): 3 bugs de unicidade e wipe corrigidos
continuous-integration/webhook Deploy concluído (VPS4)
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>
2026-05-31 15:57:37 +02:00
VPS 4 Deploy Agent e716e0e131 fix: cron enabled=1 + plan-b reenvio automático de imagens ausentes
continuous-integration/webhook Deploy concluído (VPS4)
Bug fix:
- server.js e routes/images.js: 'enabled = true' → 'enabled = 1'
  (PostgreSQL rejeita smallint = boolean — causava 'operator does not exist')

Plan B — imagens ausentes no Wasabi:
- server.js: pendingReupload (Map clientName → Set<original_filename>)
  quando getImageBufferWithFallback retorna null no endpoint /thumbnail,
  scheduleReupload() registra o original_filename e emite 'reupload-files'
  imediatamente se o cliente estiver online, ou na próxima conexão.
- server.js: client-identify agora drena a fila pendente do cliente ao
  reconectar, antes de emitir clients-list-updated.
- original_filename adicionado ao SELECT do endpoint /thumbnail.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 06:52:39 +02:00
VPS 4 Deploy Agent 67accb56aa feat: cron automático de thumbnails + lista de pacientes em tabela + CRUD
continuous-integration/webhook Deploy concluído (VPS4)
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>
2026-05-31 06:44:45 +02:00
VPS 4 Deploy Agent 8f8fba2f82 fix(thumbnail): corrige 500 em RX sem thumb — fallback Wasabi legado
continuous-integration/webhook Deploy concluído (VPS4)
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>
2026-05-31 06:34:07 +02:00
VPS 4 Deploy Agent 21f33c88a4 feat(storage): reorganiza Wasabi com estrutura clinic_name/pc_name/patient_name
continuous-integration/webhook Deploy concluído (VPS4)
- 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>
2026-05-31 01:56:18 +02:00
VPS 4 Deploy Agent 22be2adefd fix(clinics): adiciona campo senha no formulário de cadastro de clínica
continuous-integration/webhook Deploy concluído (VPS4)
- 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>
2026-05-31 01:30:52 +02:00
VPS 4 Deploy Agent 8796558fa3 feat(clinics): wipe cirúrgico por dispositivo — apaga banco + pasta Wasabi só da clínica; remove Zerar Sistema da sidebar
continuous-integration/webhook Deploy concluído (VPS4)
- 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'
2026-05-30 23:42:46 +02:00
VPS 4 Deploy Agent 74a8fa7fc4 feat(transform): páginas de orientação (flip H/V), downloads (orientada+original), vincular GTO no ajuste fino e marcar GTO enviada
continuous-integration/webhook Deploy concluído (VPS4)
- Passo de escolha: Avançar/Voltar entre rotações, espelho H e espelho V (12 orientações)
- Ajuste fino: botões Baixar orientada/original (canvas), Vincular à GTO, Salvar imagem e orientação
- View GTO: badge ENVIADA + botão 'Imagem enviada' (persiste via POST /gtos/:id/sent), baixar imagem
- Backend: coluna gtos.sent/sent_at + rota POST /gtos/:id/sent
2026-05-30 21:04:42 +02:00
VPS 4 Deploy Agent b59eae1641 fix(wasabi): reload S3 client after saving credentials (403 persistia com chave antiga em memória)
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 19:03:30 +02:00
VPS 4 Deploy Agent e232a81d66 fix: include latest_image_id in patients query — fix /api/images/undefined/thumbnail
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 17:46:47 +02:00
VPS 4 Deploy Agent 76f76f3c90 fix: add public thumbnail endpoint without auth — allow images to load without login
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 17:32:09 +02:00
VPS 4 Deploy Agent 02dcbc3fae fix: lazy-load Wasabi URLs to prevent socket.io timeout — check local files first, generate signed URLs on-demand
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 17:27:44 +02:00
VPS 4 Deploy Agent b76bb14b0a fix: serve Wasabi image URLs instead of local /uploads/ paths — prevent broken image links
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 17:22:11 +02:00
VPS 4 Deploy Agent 6901da52f0 fix: thumbnail system - 500px, always show placeholder, compact sidebar footer
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 16:22:15 +02:00
VPS 4 Deploy Agent dcfc221e9a fix: version injection server-side, sidebar spacing, thumb quality 80%, backfill, modal original full-res
continuous-integration/webhook Deploy concluído (VPS4)
2026-05-30 15:51:48 +02:00
VPS 4 Deploy Agent 6dfce6723b feat: consolidate backend improvements, frontend UX fixes and Wasabi storage support 2026-05-30 15:23:27 +02:00
VPS 4 Builder de3bbc9564 feat: adiciona rota verify-client-credentials para o client 2026-05-28 04:05:05 +02:00
VPS 4 Builder e683558b6c fix: unifica sistema de modais no admin-clinics e usa JWT_SECRET global no client-auth
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
2026-05-27 02:39:45 +02:00
VPS 4 Builder 9f4538786b fix: adiciona JWT_SECRET e ALLOWED_ORIGINS no docker-compose, e corrige enabled=1 para PostgreSQL nas rotas de imagens
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
2026-05-27 02:36:06 +02:00
VPS 4 Builder 525f98cbdb fix: modal usuários, rota wasabi storage-config, sync por permissão — v2.1.2
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
2026-05-26 23:06:01 +02:00
VPS 4 Builder 5b0d80bf22 feat: reestruturacao de menus na sidebar, niveis de acesso e migracao para postgresql/dragonflydb
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
2026-05-26 21:08:48 +02:00
VPS 4 Builder dc1801f4a7 Ajuste de cadastro/gerenciamento de usuarios e seguranca de endpoints
continuous-integration/webhook Falha no deploy (rx.scoreodonto.com)
2026-05-26 20:48:21 +02:00
VPS 4 Builder c637977d3b Fix admin-clinics auth and JWT usage 2026-05-26 05:45:13 +02:00
VPS 4 Builder a04dea830b Fix PostgreSQL GROUP BY rule for images/patients route 2026-05-26 04:25:11 +02:00
VPS 4 Builder ec3f23c9ea Implement client authentication and admin clinics panel 2026-05-26 04:17:12 +02:00
VPS 4 Builder 75c4bf3f87 feat: adicionar gerenciamento de clínicas e tokens 2026-05-26 02:59:11 +02:00
VPS 4 Builder 5d47a8ebb5 feat: adicionar thumbnails, ajuste fino flutuante e correções no dental-client 2026-05-24 23:47:54 +02:00
VPS 4 Builder c38184653a feat: migrate to postgres and dockerize app 2026-05-24 04:57:33 +02:00