Files
rx.scoreodonto.com/TAREFAS.md
T
VPS 4 Builder e683558b6c
continuous-integration/webhook Deploy concluido (rx.scoreodonto.com)
fix: unifica sistema de modais no admin-clinics e usa JWT_SECRET global no client-auth
2026-05-27 02:39:45 +02:00

6.9 KiB

🦷 Lista de Tarefas — rx.scoreodonto.com

Última atualização: 27/05/2026


🔴 CRÍTICO — Produção em risco

  • [SERVER] JWT_SECRET fixo no docker-compose.yml

    • Atualmente usa fallback hardcoded 'sua-chave-secreta-alterar-em-producao' no auth.js
    • O valor correto existe no .env da VPS4 mas não está no docker-compose.yml da VPS1
    • Impacto: toda vez que o container reinicia, todos os tokens JWT de usuários web expiram
    • Fix: adicionar - JWT_SECRET=<valor> na seção environment: do docker-compose.yml
  • [SERVER] enabled = 1 — sintaxe MySQL em queries PostgreSQL

    • Arquivos afetados:
      • server.js linhas 750 e 874
      • routes/images.js linhas 142 e 308
    • Em PostgreSQL, booleanos são true/false, não 1/0
    • Pode retornar resultados errados ou quebrar queries silenciosamente
    • Fix: substituir enabled = 1 por enabled = true em todas as ocorrências
  • [SERVER] CORS aberto com * em produção

    • ALLOWED_ORIGINS não está definido no docker-compose.yml
    • Resultado: Socket.IO aceita conexões de qualquer origem
    • Fix: adicionar - ALLOWED_ORIGINS=https://rx.scoreodonto.com no docker-compose.yml

🟠 IMPORTANTE — Funcionalidade afetada

  • [SERVER] Tabela system_config — migração em produção (VPS1)

    • A tabela foi adicionada ao database.js (cria no boot automaticamente)
    • Mas a VPS1 só vai criar a tabela após o próximo deploy + restart do container
    • Verificar após próximo deploy: docker exec rx_scoreodonto_app node -e "require('./database').initDatabase()"
    • Até lá, o endpoint GET /api/system/storage-config retorna estrutura vazia (não quebra, mas Wasabi não funciona)
  • [SERVER] Rota /api/admin/clinics — verificar middleware de admin

    • O admin-clinics.html usa um sistema de modal diferente (modal-overlay) do restante do sistema (modal)
    • Há risco de comportamento inconsistente (scroll, altura, animações)
    • Fix: unificar admin-clinics.css para usar .modal + .modal-content padrão do style.css
  • [SERVER] Autenticação via machine_token — validar fluxo completo

    • O client Windows autentica com machine_token (UUID gerado em /admin-clinics.html)
    • O fluxo de autenticação passa por routes/client-auth.js (JWT gerado com chave diferente do JWT de usuários web?)
    • Verificar se o JWT_SECRET usado no client-auth.js é o mesmo do auth.js
  • [CLIENT] Testar reconexão automática após queda de rede

    • O servidor aceita reconexão do mesmo clientId e derruba o socket antigo corretamente
    • Verificar se o client Electron reconecta automaticamente com o machine_token sem intervenção do usuário
  • [CLIENT] Confirmar que imagens não são reenviadas em duplicata após reconexão

    • O servidor já tem deduplicação por original_filename, mas precisa de teste prático

🟡 MELHORIA — UX e qualidade

  • [SERVER] Substituir window.confirm() por modal de confirmação estilizado

    • Atualmente deleteUser(), deletePatient() e resetImageToOriginal() usam confirm() nativo do browser
    • Visual feio, inconsistente e bloqueante
    • Fix: criar componente de modal de confirmação reutilizável no app.js
  • [SERVER] Atualizar versão no INSTRUCOES-SERVIDOR-VPS.txt

    • O arquivo ainda diz v2.0.0 em vários lugares
    • Sistema está em v2.1.2 (última versão em produção)
  • [SERVER] Gerenciamento de usuários — adicionar edição de usuário

    • Atualmente só é possível cadastrar e excluir
    • Falta: alterar senha, promover/revogar admin, editar e-mail
  • [SERVER] Modal "Gerenciamento de Usuários" — tabela sem paginação

    • Se houver muitos usuários, a lista não tem scroll ou paginação
    • flex: 1; overflow-y: auto já está no CSS mas o container pai precisa ter altura máxima definida
  • [SERVER] Página de reset (/reset) — verificar proteção

    • A rota /reset está mapeada na sidebar sem verificação de admin no frontend
    • Garantir que o backend exige is_admin = true antes de executar o factory reset
  • [CLIENT] Indicador visual de status de conexão na bandeja do sistema

    • O client não tem feedback claro de que está conectado/desconectado do servidor
    • Implementar ícone de status (verde = conectado, vermelho = sem conexão)
  • [CLIENT] Log de imagens enviadas visível na interface do client

    • O usuário não consegue ver se a imagem foi enviada com sucesso sem olhar o servidor
    • Mostrar histórico local das últimas N imagens enviadas com status

🔵 BACKLOG — Futuro

  • [SERVER] Implementar uso real do Wasabi (storage-config salvo, mas não aplicado)

    • A rota GET/POST /api/system/storage-config salva as credenciais no banco
    • Mas o server.js e routes/images.js ainda salvam tudo localmente em disco
    • Precisaria integrar storage.js (movido para bkp/scripts/) ao fluxo de upload
  • [SERVER] Rate limiting nas rotas de autenticação

    • POST /api/auth/login não tem proteção contra brute force
    • Implementar limite de tentativas (ex: 5 por minuto por IP) via middleware
  • [SERVER] Logs estruturados

    • Atualmente usa console.log puro
    • Migrar para logger estruturado (ex: pino) com níveis (info, warn, error) para facilitar diagnóstico
  • [SERVER] Backup automático do PostgreSQL

    • Não há rotina de dump do banco configurada
    • Configurar pg_dump agendado no cron da VPS3
  • [SERVER] Expiração de tokens JWT configurável

    • Atualmente hardcoded em auth.js
    • Mover para variável de ambiente JWT_EXPIRES_IN
  • [CLIENT] Auto-update do client Electron

    • Atualmente a atualização é manual (gerar novo .exe e instalar)
    • Implementar verificação de versão ao iniciar e notificação de nova versão disponível
  • [CLIENT] Suporte a múltiplos sensores/câmeras no mesmo PC

    • Atualmente o client monitora uma única pasta
    • Adicionar suporte a múltiplas pastas configuráveis

Concluído nesta sessão (27/05/2026)

  • Migração MySQL/SQLite → PostgreSQL + DragonflyDB completa
  • Sidebar com menus agrupados por área (principal / administrativa)
  • Controle de acesso por nível (is_admin) com ocultação de elementos via CSS
  • Correção de travamento de cliques ao abrir modais (style.display vs classList)
  • Correção 401 Unauthorized em /api/socket/status (restrito a admin)
  • Padronização de todos os modais: 90% largura, 98vh altura
  • Criação da rota GET/POST /api/system/storage-config (404 corrigido)
  • Modal "Gerenciamento de Usuários" corrigido (inline styles removidos)
  • Separação clara de "Enviar Imagens" (upload) vs "Sincronização" (dispositivos)
  • Tabela system_config adicionada ao schema do PostgreSQL
  • Limpeza do dental-server/ — 39 arquivos movidos para bkp/
  • Versão atual: v2.1.2