← Todos os projetos
Produto web

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
Página inicial do site da Artefacto

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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.