Artefacto
Plataforma institucional de uma metalúrgica com CMS próprio, cinco perfis de acesso e canal de ouvidoria anônimo.
- Período
- 2025
- Papel
- Desenvolvimento individual
- Contexto
- Artefacto — metalúrgica e madeireira, Horizontina/RS
- Stack
- Next.js 15 · TypeScript · PostgreSQL · Prisma · Tailwind CSS · JWT · Vercel Blob

O problema
Uma indústria de 40 anos que fornece para John Deere, AGCO e Stara precisa provar capacidade produtiva para compradores que nunca vão pisar na fábrica. E precisa fazer isso sem depender de um desenvolvedor toda vez que abre uma vaga, publica um post ou troca o logo de um cliente. Havia ainda uma exigência que um site institucional comum não cobre: um canal de ouvidoria que proteja de verdade quem faz a denúncia.
A abordagem
Uma aplicação só, com duas caras. A pública resolve a comunicação: vídeo institucional, linha do tempo desde 1985 e uma página por etapa produtiva, que juntas funcionam como uma visita à fábrica. A privada resolve a autonomia: um CMS próprio onde cada setor administra a sua parte — blog, vagas, currículos, contatos, orçamentos e denúncias — sem enxergar o resto.
Decisões técnicas
- 01
CMS próprio em vez de WordPress
O painel atende cinco setores com necessidades diferentes. Um CMS genérico ou daria acesso total a todo mundo ou exigiria uma pilha de plugins para chegar perto disso. Escrever o painel permitiu modelar cinco perfis (SUPER_ADMIN, MARKETING, RH, COMPLIANCE e COMERCIAL) com permissão por módulo, que é o que o negócio realmente pedia.
- 02
Autorização no middleware, não em cada página
O middleware valida sessão e permissão por módulo antes de qualquer rota de /api/admin e das escritas do blog. A consequência é o que importa: uma rota nova nasce protegida por padrão, em vez de depender de alguém lembrar de checar permissão dentro dela.
- 03
A ouvidoria protege o denunciante por desenho
A denúncia é anônima e gera um protocolo aleatório. A consulta pública devolve apenas o status, nunca o conteúdo — quem tem o protocolo não consegue ler a denúncia de volta. Os anexos vão para um Blob store separado do usado pelo blog, para que o material sensível não divida espaço com o conteúdo público.
- 04
HTML do editor sanitizado antes de renderizar
O blog usa editor rich-text, o que significa que o banco guarda HTML. Sem sanitização, o painel viraria um vetor de XSS armazenado para qualquer pessoa com acesso a ele. Todo conteúdo passa por DOMPurify antes de chegar na página.
- 05
Anti-spam sem CAPTCHA
Honeypot, tempo mínimo de preenchimento e validação de tamanho no servidor seguram bot sem colocar um obstáculo na frente do usuário. Isso vale para todos os formulários, mas decidiu-se pela ouvidoria: atrito ali desencoraja denúncia legítima.