diff --git a/TAREFAS.md b/TAREFAS.md new file mode 100644 index 0000000..5e3c9ff --- /dev/null +++ b/TAREFAS.md @@ -0,0 +1,135 @@ +# 🦷 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=` 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) + +- [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**