# 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)*