3.8 KiB
3.8 KiB
Undo/Redo System - VoIdea
Дата: 2026-05-10 Статус: Backlog (часть WebUI)
Обзор
Система отмены/повтора действий с сохранением истории в базе данных.
Архитектура
История хранится в БД
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
# Отмена последнего действия
POST /api/v1/actions/undo
# Повтор отменённого действия
POST /api/v1/actions/redo
# Получить историю
GET /api/v1/actions/history?limit=10
# Очистка истории
DELETE /api/v1/actions/history
Процесс undo
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)
Правила безопасности
- Только владелец — чужие действия нельзя отменить
- Целостность данных — проверка foreign keys
- Логирование — все undo/redo фиксируются
- Резервное копирование — состояние сохраняется до применения
UI
Кнопки в интерфейсе
- Панель инструментов: Undo ↔ Redo
- Горячие клавиши: Ctrl+Z, Ctrl+Shift+Z
- Контекстное меню: "Отменить"
Индикация
- Disabled состояние когда undo невозможен
- Tooltip с описанием действия
Падение приложения
При "падении" и невозможности оперативно исправить:
- Состояние сохраняется в БД — можно восстановить
- Последние 100 действий — доступны после перезапуска
- Manual recovery — админ может восстановить вручную
TODO
- Создать модель user_actions_history
- Реализовать undo/redo логику
- Добавить API endpoints
- Создать UI компоненты
- Настроить очистку (celery)
- Тесты
- Документация
Создано: 2026-05-10 Часть WebUI (Block 4)