209 lines
6.9 KiB
Markdown
209 lines
6.9 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)
|