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

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)

Правила безопасности

  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)