153 lines
3.8 KiB
Markdown
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)* |