6.7 KiB
6.7 KiB
Proteção contra Exclusão de Dados - Soft Delete
Problema Identificado
Quando um template ou tópico era deletado, os databooks que o utilizavam perdiam suas informações devido ao comportamento CASCADE do banco de dados.
Solução: Soft Delete (Exclusão Lógica)
Ao invés de deletar fisicamente templates e tópicos, o sistema implementa soft delete - marcando-os como inativos. Isso garante que:
- ✅ Databooks existentes continuam funcionando normalmente
- ✅ Novos databooks não podem usar templates/tópicos inativos
- ✅ É possível reativar templates/tópicos posteriormente
- ✅ Histórico completo é preservado
Implementação
1. Soft Delete em Nível de Aplicação
Templates (src/pages/Templates.tsx)
- Botão "Deletar" na verdade inativa o template (ativo = false)
- Templates inativos não aparecem na criação de novos databooks
- Databooks existentes continuam usando o template normalmente
- Interface mostra claramente que é uma inativação, não exclusão
Tópicos (src/pages/TopicosGestao.tsx)
- Botão "Deletar" marca o tópico como inativo (ativo = false)
- Tópicos inativos não aparecem na seleção de novos templates
- Databooks existentes mantêm acesso aos tópicos inativos
- Botão "Mostrar Inativos" permite visualizar e reativar tópicos
- Botão de reativação restaura tópicos inativos
2. Soft Delete em Nível de Banco de Dados
Migration 007_add_archived_status.sql
Campos Adicionados:
ativo BOOLEAN DEFAULT TRUEemtemplates_topicosetemplates_customizadosinativado_em TIMESTAMPpara rastreamento de quando foi inativado
Status "Arquivado":
- Adicionado novo status
arquivadopara projetos - Permite marcar databooks como arquivados sem deletá-los
Triggers de Soft Delete:
-
soft_delete_template()
- Intercepta comandos DELETE em templates
- Ao invés de deletar, marca como inativo (ativo = FALSE)
- Registra timestamp da inativação
- Retorna NULL para cancelar a exclusão física
-
soft_delete_topico()
- Intercepta comandos DELETE em tópicos
- Marca como inativo ao invés de deletar
- Preserva todos os dados e relacionamentos
- Impede exclusão física permanentemente
3. Comportamento de Queries
Criação de Novos Databooks:
-- Busca apenas templates ativos
SELECT * FROM templates_customizados WHERE ativo = TRUE
-- Busca apenas tópicos ativos
SELECT * FROM templates_topicos WHERE ativo = TRUE
Databooks Existentes:
-- Busca template mesmo se inativo (sem filtro de ativo)
SELECT * FROM templates_customizados WHERE id = ?
-- Busca tópicos mesmo se inativos
SELECT * FROM templates_topicos WHERE id IN (...)
Status de Databooks
| Status | Descrição | Impede Exclusão? |
|---|---|---|
| rascunho | Databook em criação | ✅ Sim |
| em_andamento | Databook sendo preenchido | ✅ Sim |
| revisao | Databook em revisão | ✅ Sim |
| finalizado | Databook concluído | ✅ Sim |
| cancelado | Databook cancelado | ❌ Não |
| arquivado | Databook arquivado | ❌ Não |
Fluxo de Inativação (Soft Delete)
Templates
- Usuário clica em "Deletar Template" (ícone de lixeira)
- Modal aparece com título "Inativar Template"
- Mensagem explica que:
- Template será ocultado de novas criações
- Databooks existentes continuarão funcionando
- É possível reativar posteriormente
- Usuário confirma
- Sistema executa DELETE (que é interceptado)
- Trigger marca template como inativo
- Template desaparece da lista de criação
- Databooks existentes continuam acessando normalmente
Tópicos
- Usuário clica em "Deletar Tópico" (ícone de lixeira)
- Modal aparece com título "Inativar Tópico"
- Mensagem explica o comportamento de soft delete
- Usuário confirma
- Sistema executa DELETE (que é interceptado)
- Trigger marca tópico como inativo
- Tópico desaparece da lista padrão
- Botão "Mostrar Inativos" permite visualizar
- Botão de reativação (ícone +) restaura o tópico
Reativação
- Usuário clica em "Mostrar Inativos"
- Tópicos/templates inativos aparecem com badge "Inativo"
- Botão de reativação (ícone +) fica disponível
- Ao clicar, tópico/template volta a ficar ativo
- Volta a aparecer na criação de novos databooks
Mensagens ao Usuário
Modal de Inativação de Template
Título: Inativar Template
Tem certeza que deseja inativar o template [Nome do Template]?
[Caixa azul]
Importante: O template será ocultado e não aparecerá mais na criação de novos databooks,
mas continuará disponível para todos os databooks existentes que já o utilizam.
Você poderá reativar este template posteriormente se necessário.
[Botões: Cancelar | Inativar]
Modal de Inativação de Tópico
Título: Inativar Tópico
Tem certeza que deseja inativar o tópico [Número] - [Título]?
[Caixa azul]
Importante: O tópico será ocultado e não aparecerá mais na criação de novos databooks,
mas continuará disponível para todos os databooks existentes que já o utilizam.
Você poderá reativar este tópico posteriormente se necessário.
[Botões: Cancelar | Inativar]
Toast de Sucesso
✓ Tópico/Template inativado com sucesso
✓ Tópico/Template reativado com sucesso
Vantagens do Soft Delete
-
Segurança Total:
- Impossível perder dados de databooks existentes
- Nenhum CASCADE pode afetar projetos em andamento
-
Flexibilidade:
- Fácil reverter decisões de "exclusão"
- Reativar tópicos/templates quando necessário
-
Auditoria:
- Histórico completo preservado
- Timestamp de quando foi inativado
- Possível rastrear quem inativou (futuro)
-
Experiência do Usuário:
- Mensagens claras sobre o que acontecerá
- Sem surpresas ou perda de dados
- Controle total sobre visibilidade
Recomendações de Uso
-
Inativar ao invés de Deletar:
- Use a função de inativação para templates/tópicos obsoletos
- Mantenha histórico completo do sistema
-
Revisar Inativos Periodicamente:
- Use "Mostrar Inativos" para revisar itens ocultos
- Reative se necessário ou mantenha inativo
-
Planejamento de Templates:
- Crie templates genéricos e reutilizáveis
- Evite criar templates muito específicos
-
Arquivar Databooks Concluídos:
- Use status "arquivado" para projetos finalizados
- Mantém organização sem perder dados
Implementação Futura
- Interface para arquivar databooks em lote
- Relatório de uso de templates e tópicos
- Rastreamento de quem inativou/reativou
- Filtros avançados para inativos
- Exclusão física permanente (apenas admin, após confirmação tripla)