Initial commit: VoIdeaAI - voice-first AI idea assistant
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
# 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)*
|
||||
Reference in New Issue
Block a user