Skip to main content

v1.12.0 — Jun 2026

🔒 Segurança

  • Backup R2 criptografado: arquivos de backup agora são criptografados com AES-256-GCM antes de serem enviados ao Cloudflare R2 — ilegíveis sem a ENCRYPTION_KEY
  • Backups sem criptografia rejeitados: sistema não aceita mais fallback para backups em texto plano
  • CSRF bypass para rotas cron: /api/cron/* usa CRON_SECRET como autenticação, sem necessidade de token CSRF

✨ Novas Funcionalidades

  • Audit Log completo com actor: todas as ações de escrita (CRUD) registram o evento com nome, email, IP e dados alterados do usuário autor — visível em Admin → Logs
  • Backup abrangente: backups automáticos agora incluem tabelas Organization, FavoriteForm, Notification e UserNotificationPreference
  • Retenção por data: limpeza de backups antigos usa janela de 30 dias (não mais “manter 3 mais recentes”)

🔧 Correções

  • GitHub Actions: workflow de backup falhava com 403 (CSRF bloqueava o POST do cron)
  • Prisma 6.19: url/directUrl migrados do schema.prisma para prisma.config.ts conforme nova API
  • Cards Visão Geral: PerformanceOverview agora preenche todo o espaço do card pai corretamente
  • Falha de descriptografia: agora registra warning em log (antes era silenciosa)

v1.11.0 — Mai 2026

✨ Novas Funcionalidades

  • Página de Configurações Redesenhada: Nova estrutura em abas — Geral, Segurança, Notificações, Privacidade e Admin — com navegação clara e separação de responsabilidades
  • Aba de Segurança: Acesso rápido às configurações de senha e autenticação de dois fatores (2FA) diretamente das configurações
  • Email unificado: User.email é agora a única fonte de verdade para o email de login — exibido consistentemente no menu do usuário, perfil e conta
  • Campo de email somente leitura: O email de login não pode mais ser alterado pelo usuário diretamente; campo marcado como bloqueado com nota explicativa
  • Correções de TypeScript: 137 erros de TypeScript corrigidos incluindo compatibilidade com Zod v4 (z.record(), .issues), parâmetros implícitos any em 26 arquivos
  • Módulo de métricas: Novo lib/metrics.ts para rastreamento de interações de usuário e performance

🔧 Correções

  • Corrigido carregamento das configurações de privacidade (nunca buscava da API ao abrir a página)
  • Corrigido guard de administrador inconsistente nas configurações (agora unificado com isSuperAdmin)
  • Corrigida exibição do email no dropdown do menu do usuário (usava Teacher.email em vez de User.email)
  • Corrigida tipagem no analisador de JSON (StructureAnalysis.allKeys, RootFieldInfo.value)
  • Corrigido acesso a propriedades aninhadas em reports/export/route.ts com submission tipado como Record<string, unknown>

v1.10.0 — Abr 2026

✨ Novas Funcionalidades

  • Módulo de Cobranças (Mobile): Administradores agora podem exigir pagamento ao aplicar testes — suporte a PIX, cartão de crédito, boleto via Asaas e métodos externos (PIX externo, cartão)
  • Tela de Cobranças no App: Nova tela /assessments/payments lista todas as cobranças da organização com estatísticas (pendentes, pagos, total arrecadado) e filtros por status
  • Ações de pagamento para admins: Confirmar pagamento, isentar participante, cancelar cobrança e sincronizar status com Asaas diretamente do app mobile
  • Bloqueio de teste por pagamento: Participante com cobrança pendente vê aviso e link de pagamento antes de iniciar o teste
  • Webhook Asaas: POST /api/webhooks/asaas recebe notificações de pagamento e atualiza automaticamente o status das atribuições

🔌 Novos Endpoints (API Mobile)

  • GET /api/mobile/payments — lista cobranças da organização com stats
  • GET /api/mobile/assignments/:id/payment — status de pagamento de uma atribuição
  • POST /api/mobile/assignments/:id/payment — cria cobrança (Asaas ou externa)
  • POST /api/mobile/assignments/:id/payment/confirm — confirma pagamento manualmente
  • POST /api/mobile/assignments/:id/payment/exempt — isenta participante do pagamento
  • POST /api/mobile/assignments/:id/payment/cancel — cancela cobrança
  • POST /api/mobile/assignments/:id/payment/sync — sincroniza status com Asaas

v1.9.0 — Mar 2026

🔒 Segurança (Auditoria OWASP)

  • CSP expandido: script-src, style-src e connect-src agora incluem domínios da Vercel (vercel.live, *.vercel.live) e Pusher (*.pusher.com) para eliminar bloqueios do toolbar de preview
  • Rate limiting fail-open: quando o Redis está indisponível, requisições de autenticação são permitidas em vez de retornar 503 — evita bloqueio de logins legítimos por falha de infraestrutura
  • Tokens de redefinição de senha hasheados: tokens de reset agora são armazenados como SHA-256 no banco (não mais em texto plano); expiração reduzida de 24h para 30 minutos
  • Rate limiting no /api/users/forgot-password: proteção por IP e por e-mail contra ataques de enumeração
  • Validação do parâmetro state na API IBGE: aceita apenas [A-Z]{2} para prevenir path injection
  • CSRF fail-safe: ensureCsrfCookie e validateCsrf em proxy.ts agora são envolvidos em try-catch — ausência de CSRF_SECRET não causa crash em todas as requisições
  • CORS Allow-Credentials: enviado apenas para origens confiáveis (flag isTrustedOrigin)
  • unsafe-eval condicional: presente apenas em NODE_ENV=development
  • Remoção de log de assignmentToken: bloco de debug que expunha token em texto plano foi removido de /api/forms/[formId]/route.ts

🗄️ Banco de Dados

  • connect_timeout=30 adicionado à URL do Prisma: suporta cold-start do Neon free tier (que pode demorar até 15s para acordar de suspend)
  • Cache do PrismaClient em produção: globalThis.prisma agora é cacheado também em NODE_ENV=production, evitando nova conexão TCP a cada request em containers Lambda aquecidos

🐛 Correções

  • 500 em /api/auth/check-credentials no Vercel: removidas importações não utilizadas (generateEmailCode, hashToken, sendEmailNotification) que carregavam o módulo notificationEmail.ts com new Resend(undefined), causando crash no bundle
  • RESEND_API_KEY undefined: new Resend(process.env.RESEND_API_KEY ?? '') — SDK não lança mais exceção na inicialização do módulo quando a variável estiver ausente
  • Rate limiter módulo-level throw: refatorado para lazy initialization — REDIS_URL ausente não causa 500 no import do módulo
  • ENVIRONMENT_FALLBACK: timeZone: NextIntlClientProvider agora recebe timeZone="America/Sao_Paulo" explicitamente

v1.8.0 — Mar 2026

✨ Novas Funcionalidades

  • Histórico de Notificações Enviadas: Nova aba “Enviadas” no painel de Notificações exibe todas as notificações (e-mail e in-app) já entregues, com destinatário, canal, tipo e data de envio
  • Agendamentos visíveis para Admins: ADMIN e SUPER_ADMIN agora visualizam todos os agendamentos de testes na plataforma, independente de quem os criou

🔒 Controle de Acesso

  • Modelos de E-mail e Notificações restritos a SUPER_ADMIN: Itens “Modelos de E-mail” e “Notificações” no sidebar agora visíveis apenas para Super Administradores
  • Link de Administração em Configurações restrito a SUPER_ADMIN: A aba “Administração” na página de Configurações agora aparece apenas para Super Administradores

🐛 Correções

  • Nome do usuário não era salvo ao editar: PUT /api/users passa a incluir o campo name no updateData e sincroniza o registro Teacher vinculado
  • Redirecionamento lento após criar usuário: Removida chamada redundante router.refresh() após router.push(); adicionado revalidatePath na server action createUserAction
  • Listas desatualizadas após exclusão: Adicionado router.refresh() após delete em Usuários, Professores e Alunos para recarregar dados do servidor
  • Duplo ícone X na barra de pesquisa: Campo de busca no TopBar alterado de type="search" para type="text", eliminando o X nativo do browser que aparecia junto ao X customizado
  • Validação de campos obrigatórios no agendamento de notificações: Erros específicos por campo — Título sempre obrigatório; Mensagem obrigatória apenas para canais in-app/ambos; Assunto obrigatório apenas para canais e-mail/ambos
  • Chaves i18n ausentes: Adicionadas topbar.searchStudents, adminNotifications.sentNotificationsTitle, adminNotifications.noSentNotifications em pt.json e en.json

v1.7.0 — Fev 2026

✨ Melhorias de UI/UX

  • Campo de pesquisa padronizado: Todas as páginas de listagem (Alunos, Modelos de Testes) agora utilizam o componente Input padrão da plataforma com ícone Search, garantindo consistência visual
  • Botão “Novo Agendamento”: Movido para o PageHeader, seguindo o padrão já adotado em “Novo Aluno” e demais seções
  • Filtros alinhados: Campos de busca e filtros de status na listagem de agendamentos agora estão lado a lado, alinhados à direita

🌐 Internacionalização (i18n)

  • Eliminadas ternárias de tradução manual (locale === "en" ? "..." : "..."): Todos os textos de UI nos módulos de Agendamento (ScheduleTestClient, edit/page.tsx, new/page.tsx) e Aplicação de Testes (ApplyTestClient) agora usam useTranslations() / getTranslations() com chaves em pt.json e en.json
  • 34 novas chaves de tradução adicionadas em scheduledTests.* (rótulos de campos, validações, toasts, títulos de página) e applyTest.openTest

🐛 Correções

  • Erro de build JSX (Expected ',', got '{'): Corrigida div extra fora de ordem em ScheduledListClient.tsx que causava falha no parse do Next.js/Turbopack

v1.6.0 — Fev 2026

🎯 Novas Funcionalidades

  • Cancelamento de Agendamentos: Testes agendados podem ser cancelados com justificativa obrigatória (mínimo 10 caracteres)
    • Novo campo cancelledAt e cancellationReason no modelo TestAssignment
    • Botão de cancelamento na listagem de agendamentos (ScheduledListClient)
    • Possibilidade de reativar testes cancelados
    • Filtro “cancelados” adicionado à interface de agendamentos
  • Preservação de Drafts: Respostas parciais (drafts) agora são preservadas quando formulários são editados
    • Proteção contra deleção de respostas de drafts ao remover perguntas do formulário
    • Filtro automático de respostas de perguntas removidas ao carregar drafts
    • Endpoint /api/assignments/[token]/draft reativado com salvamento completo

🛠️ Scripts de Manutenção

  • Limpeza de Drafts Órfãos: Novos scripts para manutenção do banco de dados
    • pnpm cleanup:orphaned-drafts — Remove respostas órfãs de drafts com 30+ dias
    • pnpm cleanup:orphaned-drafts:dry-run — Modo seguro para visualizar o que seria deletado
    • pnpm cleanup:orphaned-drafts:90d — Remove apenas drafts com 90+ dias
    • pnpm draft:check <token> — Verifica respostas salvas em draft para um token específico

🐛 Correções

  • Import de isRedirectError: Corrigido import para usar next/dist/client/components/redirect-error (compatível com Next.js 16)
  • TypeScript: Adicionado campo formTitleSnapshot à interface Submission em ReportsClient
  • Draft POST: Reativado salvamento de drafts via API que estava desabilitado

📝 Documentação

  • Todos os scripts do package.json agora possuem comentários explicativos na seção _comments
  • Adicionado guia de teste em scripts/test-draft-preservation.md

v1.5.0 — Fev 2026

✨ Melhorias

  • Settings — painel Admin: Seção de Gerenciamento de Dados adicionada à aba Admin de /settings, com links diretos para:
    • Recuperação de Registros (soft-delete-recovery)
    • Estatísticas de Criptografia (encryption-stats)
    • Políticas de Retenção (retention-policies)
  • Internacionalização (i18n): Corrigidas chaves de tradução ausentes nas páginas de configurações para EN e PT, eliminando fallbacks em texto bruto no painel admin.

🐛 Correções

  • Hydration mismatch (AuthenticatedLayout): Corrigido erro React de hidratação que ocorria quando o servidor renderizava o AppShell autenticado mas o cliente iniciava com status: "loading" (sessão ainda nula), gerando divergência de árvore DOM. O shell mínimo agora só é renderizado após a sessão ser confirmada como inativa (status !== "loading" && !isSignedIn).
  • Erro TypeError Cannot read properties of null (reading 'parentNode'): Consequência direta do hydration mismatch acima — corrigido com a mesma solução.

⚡ Performance & Dependências

  • Removido Lottie / DotLottie: Removidas as dependências @lottiefiles/dotlottie-react, lottie-react e lottie-web (≈ 700 KB de JS no bundle). Substituídas por:
    • PageLoadingScreen → spinner CSS puro (Tailwind animate-spin)
    • SuccessAnimation → SVG checkmark inline em círculo verde
    • GreetingHeaderClient → emojis nativos (☀️ / 🌤️ / 🌙)
  • Removido script copy:wasm: O arquivo dotlottie-player.wasm não é mais necessário. O script postinstall foi simplificado para prisma generate apenas.
  • Removido DotLottieConfig.tsx: Componente de configuração de WASM deletado e removido do layout raiz.

v1.4.9 — Fev 2026

  • Melhorias no seletor de faixas de pontuação na criação de testes
  • Suporte a cidades brasileiras no cadastro de alunos e candidatos (brazilianCities.ts)
  • Correções de layout na tela de candidatos
  • Aprimoramento do componente ImageCropper para upload de avatares

v1.4.8 — Jan 2026

  • Adição do módulo de logs em tempo real via SSE (RealTimeLogsViewer)
  • Templates de e-mail com suporte a variáveis dinâmicas Handlebars
  • Página de estatísticas de criptografia (encryption-stats)
  • Recuperação de soft-delete no painel admin
  • Políticas de retenção de dados configuráveis

v1.4.7 — Jan 2026

  • Notificações agendadas com data/hora e cancelamento
  • Preview ao vivo de templates de e-mail no editor
  • Suporte a upload de HTML como template de notificação
  • Melhoria no sistema de busca global (GlobalSearch)

v1.4.6 — Dez 2025

  • Suporte a organizações/unidades com planos (Free / Pro / Enterprise)
  • Módulo de candidatos com promoção para aluno
  • Auditoria de ações (audit-logger.ts)
  • Integração com Microsoft Clarity para análise de usabilidade