Files
dbmaker/docs/PROTECAO_EXCLUSAO.md

209 lines
6.7 KiB
Markdown

# 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 TRUE` em `templates_topicos` e `templates_customizados`
- `inativado_em TIMESTAMP` para rastreamento de quando foi inativado
**Status "Arquivado":**
- Adicionado novo status `arquivado` para projetos
- Permite marcar databooks como arquivados sem deletá-los
**Triggers de Soft Delete:**
1. **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
2. **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:**
```sql
-- 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:**
```sql
-- 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
1. Usuário clica em "Deletar Template" (ícone de lixeira)
2. Modal aparece com título "Inativar Template"
3. Mensagem explica que:
- Template será ocultado de novas criações
- Databooks existentes continuarão funcionando
- É possível reativar posteriormente
4. Usuário confirma
5. Sistema executa DELETE (que é interceptado)
6. Trigger marca template como inativo
7. Template desaparece da lista de criação
8. Databooks existentes continuam acessando normalmente
### Tópicos
1. Usuário clica em "Deletar Tópico" (ícone de lixeira)
2. Modal aparece com título "Inativar Tópico"
3. Mensagem explica o comportamento de soft delete
4. Usuário confirma
5. Sistema executa DELETE (que é interceptado)
6. Trigger marca tópico como inativo
7. Tópico desaparece da lista padrão
8. Botão "Mostrar Inativos" permite visualizar
9. Botão de reativação (ícone +) restaura o tópico
### Reativação
1. Usuário clica em "Mostrar Inativos"
2. Tópicos/templates inativos aparecem com badge "Inativo"
3. Botão de reativação (ícone +) fica disponível
4. Ao clicar, tópico/template volta a ficar ativo
5. 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
1. **Segurança Total:**
- Impossível perder dados de databooks existentes
- Nenhum CASCADE pode afetar projetos em andamento
2. **Flexibilidade:**
- Fácil reverter decisões de "exclusão"
- Reativar tópicos/templates quando necessário
3. **Auditoria:**
- Histórico completo preservado
- Timestamp de quando foi inativado
- Possível rastrear quem inativou (futuro)
4. **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
1. **Inativar ao invés de Deletar:**
- Use a função de inativação para templates/tópicos obsoletos
- Mantenha histórico completo do sistema
2. **Revisar Inativos Periodicamente:**
- Use "Mostrar Inativos" para revisar itens ocultos
- Reative se necessário ou mantenha inativo
3. **Planejamento de Templates:**
- Crie templates genéricos e reutilizáveis
- Evite criar templates muito específicos
4. **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)