Pular para o conteúdo
caua.tolentino
Todos os cases
Investigação

Administrador excluído que parecia voltar a ficar ativo

Um administrador de loja não conseguia entrar no sistema. Na análise, descobri que o usuário estava excluído no banco e que a regra que impedia a exclusão só escondia um botão. Usei a lógica dela para criar a regra no backend, e a tela passou a seguir essa regra em todos os caminhos de exclusão.

Papel
Desenvolvedor responsável, do diagnóstico à entrega
Contexto
Plataforma de e-commerce com marketplace
Stack
PHP, Symfony, Twig, JavaScript
Time
Solo
Período
2026

Case anonimizado: nomes de empresa, cliente e pessoas foram omitidos ou trocados.

01. Situação

Um administrador de loja não conseguia entrar no sistema

Num marketplace, cada loja tem um administrador. O chamado chegou com uma única informação: o administrador de uma loja não conseguia fazer login.

Do ponto de vista do cliente, ele tinha seguido um processo simples. Excluiu um administrador pela tela geral de administradores e, depois, editou a loja para colocar outro no lugar. Na tela da loja, tudo parecia certo, mas o acesso não funcionava.

02. Investigação

A regra existia, mas só escondia um botão

Parti do login que falhava e fui ao banco conferir o usuário. Ele estava marcado como excluído. A partir daí, reconstruí o caminho: a exclusão pela tela geral tinha funcionado, mas a loja continuava apontando para o administrador excluído. Ao editar a loja, o cliente alterava esse mesmo usuário, que aparecia como ativo na tela e continuava excluído no banco. O sistema ficava num estado inconsistente: uma loja ativa apontando para um administrador excluído.

Reproduzi o cenário, abri o chamado e assumi a correção. A suspeita natural era a tela da loja, que mostrava um usuário excluído. Antes de mexer nela, fui entender por que essa exclusão tinha sido possível.

Encontrei uma regra que a plataforma já tinha: o administrador de uma loja ativa não pode ser excluído. Ela estava numa função de template e servia apenas para esconder o botão de exclusão de cada linha da lista.

Mapeei todos os caminhos de exclusão e vi que só um dos três respeitava a regra. As caixas de seleção para excluir vários usuários de uma vez não a consultavam, e o serviço de exclusão no backend também não.

caminhos de exclusão que respeitavam a regra
1 de 3

03. Solução

Levar a regra para o backend e fazer a tela consultá-la

Decidi corrigir a origem, a exclusão indevida, e não a tela onde o sintoma aparecia.

Comecei pelo backend. Usei a lógica da função de template como base e implementei a regra no serviço de exclusão: se o usuário é administrador de uma loja ativa, o serviço recusa a operação, e o controller responde com acesso negado e uma mensagem. A partir daí, nem uma chamada direta ao endpoint consegue fazer essa exclusão.

Com a regra garantida no backend, levei ela para a tela. A função de template, que tinha a própria cópia da verificação, passou a consultar o serviço, e assim o backend virou a única fonte da regra. Cada linha da lista passou a informar se o usuário pode ser excluído, e a exclusão em massa usa essa informação: avisa que usuários vinculados a uma loja não podem ser excluídos e não envia nada.

Escolha

Bloquear a exclusão, não esconder o excluído

Esconder o usuário excluído na tela da loja resolveria a aparência, mas manteria uma loja ativa sem administrador válido.

Escolha

Backend primeiro, tela depois

Uma regra só na tela pode ser contornada por qualquer chamada direta. Implementei a regra no serviço e fiz a tela consultá-lo, em vez de manter duas verificações que poderiam divergir.

Cuidado

Deploy com limpeza de cache

O serviço ganhou uma dependência nova, então o deploy precisava limpar o cache do container. Avisei isso no chamado.

04. Resultado

O administrador de uma loja ativa não pode mais ser excluído por nenhum caminho

A regra passou a existir em um lugar só, o serviço de exclusão, e os três caminhos de exclusão, botão por linha, exclusão em massa e chamada direta, passaram a respeitá-la. O estado inconsistente deixou de ser criado, e uma mudança futura na regra vale para todos os caminhos de uma vez.