Lincoln Berto
Vamos conversar
Todos os projetos
Em produção · uso interno

Help TI · central de chamados

Sistema de chamados de TI para uma empresa onde eu sou o único profissional da área. O colaborador abre o chamado sem login, recebe um protocolo e acompanha o andamento. Eu atendo a fila num painel fechado.

Meu papel
Projeto inteiro: banco, segurança, telas e publicação
Período
2026 · em uso na empresa
Stack
React, TypeScript, Vite, Supabase, PostgreSQL
Links
help ti · painel do técnico
Painel do técnico com a fila de chamados fictícios, cada um com protocolo, categoria, prioridade e status
  • 0logins para o colaborador abrir um chamado
  • 5erros em 15 min e a consulta daquele protocolo trava
  • ~123tentativas por segundo antes da proteção
  • 0dados pessoais na aba de resultados

o problema

Pedidos de TI que se perdiam no caminho

Sou o único profissional de TI da empresa. Os pedidos chegavam pelo WhatsApp, no corredor e de boca, e muitos se perdiam. Não havia como saber o que estava aberto, o que já tinha sido resolvido nem quanto tempo cada coisa levava.

A solução precisava ser mais fácil que mandar uma mensagem. Se abrir um chamado desse trabalho, ninguém ia usar.

o que eu construí

Dois lados do mesmo sistema

Para o colaborador

  • Abertura sem login: nome, setor, categoria, prioridade e descrição
  • Protocolo no formato #TI-2026-XXXX (e confete)
  • Botão que avisa o TI no WhatsApp com a mensagem pronta
  • Consulta do andamento com protocolo e primeiro nome

Para o técnico

  • Painel fechado: login e conta cadastrada na equipe
  • Fila com status: aberto, em andamento, aguardando e resolvido
  • Notas públicas e internas em cada chamado
  • Resultados: tempo médio, categorias e setores, só em números

decisões técnicas

Aberto para escrever, fechado para ler

Qualquer colaborador precisa conseguir abrir um chamado sem senha. Mas os chamados têm nome, setor e problemas de cada pessoa. A segurança fica no banco, não na tela, e a LGPD foi requisito desde o início.

  • Row Level Security no PostgreSQL

    Qualquer pessoa pode criar um chamado, mas ninguém de fora consegue ler a tabela. Só quem está cadastrado na equipe de TI lê e atualiza. O site usa só a chave pública do Supabase: quem decide o que cada um vê é o banco.

  • Consulta pública por uma função, não pela tabela

    Em vez de liberar leitura, a consulta chama uma função que recebe protocolo e primeiro nome e devolve só o necessário: status, categoria, datas e as notas públicas. A nota interna nunca sai do banco.

  • Ataquei meu próprio sistema

    Testei força bruta na consulta e ela aceitava cerca de 123 tentativas por segundo. Agora, depois de 5 erros em 15 minutos, aquele protocolo fica bloqueado. O limite é por protocolo e não por IP: dentro do banco o IP chega por cabeçalho e pode ser falsificado.

limite_tentativas_consulta.sql
-- erros no mesmo protocolo nos últimos 15 minutos
select count(*) into v_failures
from public.ticket_lookup_attempts a
where a.protocol = v_protocol
  and a.attempted_at > now() - interval '15 minutes';

if v_failures >= 5 then
  return jsonb_build_object('blocked', true);
end if;

telas

Menos barreira, mais gente usando

O sistema em produção guarda dados reais dos colaboradores, por isso não é aberto ao público. Todas as telas abaixo usam dados fictícios.

help ti · abrir chamado
Formulário de abertura de chamado com nome, setor, categoria, prioridade e descrição
Abrir chamado, sem login
Consulta do chamado no celular, com o status e as notas do técnico
Consulta no celular
help ti · painel do técnico
Chamado aberto no painel com uma nota marcada como Interna, que não aparece para o colaborador
A nota marcada como Interna não aparece na consulta do colaborador
help ti · resultados
Aba de resultados com total de chamados, abertos, resolvidos, tempo médio e gráficos por categoria, setor e prioridade
Resultados: só números, sem dados pessoais

o que eu aprendi

Pensar como quem vai atacar

No portal de vagas aprendi a proteger dados pessoais. Aqui fui um passo além: em vez de só confiar nas regras, tentei quebrar o sistema. Foi assim que achei a brecha da força bruta, antes de qualquer outra pessoa.

Também aprendi a não complicar. São só quatro telas, então o próprio endereço decide qual mostrar, sem biblioteca de rotas. E toda mudança no banco fica numa migration versionada, com o porquê comentado.

Próximo case Sonar Segurança Eletrônica

Tem uma vaga ou um projeto em mente?

Me conta o que você precisa que eu te respondo.