Files
voidea/docs/backlog/undo-redo-note.md

153 lines
3.8 KiB
Markdown

# Undo/Redo System - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (часть WebUI)
---
## Обзор
Система отмены/повтора действий с сохранением истории в базе данных.
---
## Архитектура
### История хранится в БД
```sql
CREATE TABLE user_actions_history (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
action_type VARCHAR(50) NOT NULL,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID NOT NULL,
previous_state JSONB NOT NULL,
new_state JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX ix_user_actions_user_id ON user_actions_history(user_id);
CREATE INDEX ix_user_actions_created_at ON user_actions_history(created_at);
```
---
## Типы действий
### Отменяемые
- Создание идеи
- Редактирование идеи
- Удаление идеи
- Изменение настроек
- Действия с ИИ-агентами
### Не отменяемые
- Авторизация (вход/выход)
- Удаление аккаунта
- Оплата
- Массовые операции
---
## Лимиты
- Максимум действий в истории: 100
- Срок хранения: 7 дней
- Автоочистка старых записей
---
## API
```python
# Отмена последнего действия
POST /api/v1/actions/undo
# Повтор отменённого действия
POST /api/v1/actions/redo
# Получить историю
GET /api/v1/actions/history?limit=10
# Очистка истории
DELETE /api/v1/actions/history
```
---
## Процесс undo
```python
async def undo(user_id: UUID) -> ActionResult:
# 1. Получить последнее действие
action = await get_last_action(user_id)
# 2. Валидация (можно ли отменить)
if not can_undo(action):
raise UndoNotAllowed()
# 3. Восстановление предыдущего состояния
await restore_previous_state(action)
# 4. Запись в redo stack
await add_to_redo_stack(action)
# 5. Удаление из истории
await remove_from_history(action)
return ActionResult(success=True)
```
---
## Правила безопасности
1. **Только владелец** — чужие действия нельзя отменить
2. **Целостность данных** — проверка foreign keys
3. **Логирование** — все undo/redo фиксируются
4. **Резервное копирование** — состояние сохраняется до применения
---
## UI
### Кнопки в интерфейсе
- Панель инструментов: Undo ↔ Redo
- Горячие клавиши: Ctrl+Z, Ctrl+Shift+Z
- Контекстное меню: "Отменить"
### Индикация
- Disabled состояние когда undo невозможен
- Tooltip с описанием действия
---
## Падение приложения
При "падении" и невозможности оперативно исправить:
1. **Состояние сохраняется в БД** — можно восстановить
2. **Последние 100 действий** — доступны после перезапуска
3. **Manual recovery** — админ может восстановить вручную
---
## TODO
- [ ] Создать модель user_actions_history
- [ ] Реализовать undo/redo логику
- [ ] Добавить API endpoints
- [ ] Создать UI компоненты
- [ ] Настроить очистку (celery)
- [ ] Тесты
- [ ] Документация
---
*Создано: 2026-05-10*
*Часть WebUI (Block 4)*