Версионирование проекта
Версионирование — это автоматическая история снимков проекта с возможностью отката к любой сохранённой версии. По принципу работы напоминает Workflow history в n8n: каждое сохранение проекта фиксирует его состояние, а позже можно вернуться к нужному снимку одним нажатием.
Как это работает
При каждом сохранении проекта (обновление поля data) сервер автоматически создаёт снимок — запись со слепком всех данных проекта (ноды, листы, настройки). Снимок сопровождается метаданными:
- Дата создания — когда был сделан снимок.
- Метка — имя проекта на момент сохранения.
- Автор — пользователь, сохранивший проект (если известен).
Создание снимка не блокирует сохранение проекта: если по какой-то причине снимок не удалось записать, основное сохранение всё равно проходит, а ошибка попадает только в лог сервера.
Где хранится
Снимки хранятся в отдельной таблице базы данных project_versions. Само состояние проекта лежит в колонке snapshot типа jsonb. Каждая запись привязана к проекту через project_id с каскадным удалением — при удалении проекта вся его история версий удаляется автоматически.
Лимит версий
Хранятся последние 30 версий каждого проекта. После создания нового снимка более старые версии сверх лимита автоматически удаляются (по дате создания). Это удерживает размер истории под контролем и не даёт таблице бесконтрольно расти.
Откат к версии
Вкладка «История версий» в боковой навигации редактора показывает список снимков от новых к старым. У каждой версии есть кнопка «Восстановить»:
- Выбранный снимок записывается обратно в проект.
- Синхронизируется таблица контента
_content, а боту отправляется сигнал на перезагрузку. - Холст редактора перезагружается из восстановленной серверной версии, локальные несохранённые изменения сбрасываются.
API
GET /api/projects/:id/versions— список версий проекта (только метаданные, без тяжёлого снимка).POST /api/projects/:id/versions/:versionId/restore— восстановить проект из указанной версии.
Оба маршрута защищены проверкой готовности БД и доступа к проекту.