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/*usaCRON_SECRETcomo 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,NotificationeUserNotificationPreference - 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/directUrlmigrados doschema.prismaparaprisma.config.tsconforme 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ícitosanyem 26 arquivos - Módulo de métricas: Novo
lib/metrics.tspara 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.emailem vez deUser.email) - Corrigida tipagem no analisador de JSON (
StructureAnalysis.allKeys,RootFieldInfo.value) - Corrigido acesso a propriedades aninhadas em
reports/export/route.tscomsubmissiontipado comoRecord<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/paymentslista 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/asaasrecebe 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 statsGET /api/mobile/assignments/:id/payment— status de pagamento de uma atribuiçãoPOST /api/mobile/assignments/:id/payment— cria cobrança (Asaas ou externa)POST /api/mobile/assignments/:id/payment/confirm— confirma pagamento manualmentePOST /api/mobile/assignments/:id/payment/exempt— isenta participante do pagamentoPOST /api/mobile/assignments/:id/payment/cancel— cancela cobrançaPOST /api/mobile/assignments/:id/payment/sync— sincroniza status com Asaas
v1.9.0 — Mar 2026
🔒 Segurança (Auditoria OWASP)
- CSP expandido:
script-src,style-srceconnect-srcagora 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
statena API IBGE: aceita apenas[A-Z]{2}para prevenir path injection - CSRF fail-safe:
ensureCsrfCookieevalidateCsrfemproxy.tsagora são envolvidos em try-catch — ausência deCSRF_SECRETnão causa crash em todas as requisições CORS Allow-Credentials: enviado apenas para origens confiáveis (flagisTrustedOrigin)unsafe-evalcondicional: presente apenas emNODE_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=30adicionado à 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.prismaagora é cacheado também emNODE_ENV=production, evitando nova conexão TCP a cada request em containers Lambda aquecidos
🐛 Correções
- 500 em
/api/auth/check-credentialsno Vercel: removidas importações não utilizadas (generateEmailCode,hashToken,sendEmailNotification) que carregavam o módulonotificationEmail.tscomnew Resend(undefined), causando crash no bundle RESEND_API_KEYundefined: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_URLausente não causa 500 no import do módulo ENVIRONMENT_FALLBACK: timeZone:NextIntlClientProvideragora recebetimeZone="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/userspassa a incluir o camponamenoupdateDatae sincroniza o registroTeachervinculado - Redirecionamento lento após criar usuário: Removida chamada redundante
router.refresh()apósrouter.push(); adicionadorevalidatePathna server actioncreateUserAction - 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"paratype="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.noSentNotificationsempt.jsoneen.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
Inputpadrão da plataforma com íconeSearch, 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 usamuseTranslations()/getTranslations()com chaves empt.jsoneen.json - 34 novas chaves de tradução adicionadas em
scheduledTests.*(rótulos de campos, validações, toasts, títulos de página) eapplyTest.openTest
🐛 Correções
- Erro de build JSX (
Expected ',', got '{'): Corrigidadivextra fora de ordem emScheduledListClient.tsxque 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
cancelledAtecancellationReasonno modeloTestAssignment - Botão de cancelamento na listagem de agendamentos (
ScheduledListClient) - Possibilidade de reativar testes cancelados
- Filtro “cancelados” adicionado à interface de agendamentos
- Novo campo
- 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]/draftreativado 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+ diaspnpm cleanup:orphaned-drafts:dry-run— Modo seguro para visualizar o que seria deletadopnpm cleanup:orphaned-drafts:90d— Remove apenas drafts com 90+ diaspnpm draft:check <token>— Verifica respostas salvas em draft para um token específico
🐛 Correções
- Import de
isRedirectError: Corrigido import para usarnext/dist/client/components/redirect-error(compatível com Next.js 16) - TypeScript: Adicionado campo
formTitleSnapshotà interfaceSubmissionemReportsClient - Draft POST: Reativado salvamento de drafts via API que estava desabilitado
📝 Documentação
- Todos os scripts do
package.jsonagora 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)
- Recuperação de Registros (
- 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 oAppShellautenticado mas o cliente iniciava comstatus: "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-reactelottie-web(≈ 700 KB de JS no bundle). Substituídas por:PageLoadingScreen→ spinner CSS puro (Tailwindanimate-spin)SuccessAnimation→ SVG checkmark inline em círculo verdeGreetingHeaderClient→ emojis nativos (☀️ / 🌤️ / 🌙)
- Removido script
copy:wasm: O arquivodotlottie-player.wasmnão é mais necessário. O scriptpostinstallfoi simplificado paraprisma generateapenas. - 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
ImageCropperpara 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