# 🦷 Lista de Tarefas — rx.scoreodonto.com > Última atualização: 27/05/2026 --- ## 🔴 CRÍTICO — Produção em risco - [x] **[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=` na seção `environment:` do `docker-compose.yml` - [x] **[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 - [x] **[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) - [x] **[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` - [x] **[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) - [x] Migração MySQL/SQLite → PostgreSQL + DragonflyDB completa - [x] Sidebar com menus agrupados por área (principal / administrativa) - [x] Controle de acesso por nível (is_admin) com ocultação de elementos via CSS - [x] Correção de travamento de cliques ao abrir modais (style.display vs classList) - [x] Correção 401 Unauthorized em `/api/socket/status` (restrito a admin) - [x] Padronização de todos os modais: 90% largura, 98vh altura - [x] Criação da rota `GET/POST /api/system/storage-config` (404 corrigido) - [x] Modal "Gerenciamento de Usuários" corrigido (inline styles removidos) - [x] Separação clara de "Enviar Imagens" (upload) vs "Sincronização" (dispositivos) - [x] Tabela `system_config` adicionada ao schema do PostgreSQL - [x] Limpeza do `dental-server/` — 39 arquivos movidos para `bkp/` - [x] Versão atual: **v2.1.2**