Skip to content

Documents ​

Назначение ​

Сервис управления документами в мультитенантных пространствах (spaces). Обеспечивает полный жизненный цикл документов: создание, иерархическая деревевидная организация, избранное, soft/hard удаление, дублирование, перемещение, автоматическое создание при создании пространства.

Порты ​

  • HTTP: 8093
  • БД: documents_db

Ключевые возможности ​

  • CRUD документов с иерархической деревевидной структурой (parent_id — self-referential FK)
  • Типы документов: wysiwyg (по умолчанию), markdown, case-diagram, custom
  • Tree endpoint: вложенная JSON-структура всех документов
  • Breadcrumb path при получении одного документа (путь от корня)
  • Soft delete (с deleted_at timestamp) + hard delete (каскадно с дочерними)
  • Восстановление soft-deleted документов
  • Дублирование с автогенерацией имён: "Name (1)", "Name (2)"
  • Перемещение между родителями (или в корень)
  • Избранное: per-user, per-space, уникальный constraint (user_id, document_id)
  • Event-driven: подписка на spaces.created-with-user-creation → автосоздание дефолтного документа
  • HTTP event endpoint: POST /api/v1/events для внешних событий
  • Аутентификация: JWT Bearer + app-user-id + app-space-id headers

Required Headers (все /api/v1 endpoints) ​

HeaderОписание
app-user-idUUID пользователя
app-space-idUUID пространства
AuthorizationBearer <JWT token>

Mindmap-документы (type: case-diagram) ​

Документы с type = "case-diagram" рендерятся в Notes как майнд-карты (MindMup-подобный редактор), а не как TipTap-текст. Тело документа (body) — JSON структуры:

json
{
  "version": 1,
  "root": {
    "id": "uuid", "text": "Корень",
    "children": [
      { "id": "uuid", "text": "Ветка", "collapsed": false,
        "style": { "color": "blue", "priority": 1, "icon": "lucideFlag" },
        "note": "заметка узла", "children": [] }
    ]
  },
  "links": [ { "id": "uuid", "from": "uuid", "to": "uuid", "label": "связь" } ]
}
  • children — дерево веток; links — произвольные связи между узлами (не часть дерева, рисуются пунктиром).
  • Узел может нести ref: { kind, id } — ссылку на сущность платформы (command, flow, env, service, ai_provider, document); зарезервировано для графов зависимостей.
  • Экспорт/импорт — Mermaid mindmap; кросс-связи сохраняются в хвостовом блоке %% link: <узел> -> <узel> [| метка] и восстанавливаются при импорте.

Реалтайм: совместное редактирование идёт поверх Centrifugo-канала documents:mindmap:<documentId> (Yjs, namespace documents, client publish включён). Текстовые документы используют соседний канал documents:doc:<id> — форматы состояния разные и не пересекаются.

Сохранение: тот же PATCH /documents/{spaceId}/{id}; клиент дебаунсит снапшоты карты (~800 мс) и пишет их в body как строку JSON. Создание — обычный POST с type: "case-diagram" и seed-телом.

Структура БД ​

Таблица documents ​

КолонкаОписание
idUUID PK
nameНазвание (varchar 255)
bodyСодержимое (text)
typeТип (wysiwyg/markdown/case-diagram/custom)
space_idUUID пространства (indexed)
parent_idUUID родителя (self-ref FK, CASCADE delete, indexed)
deleted_atSoft delete timestamp (indexed)

Таблица favorites ​

КолонкаОписание
idUUID PK
user_idUUID пользователя (indexed)
document_idUUID документа (FK, CASCADE delete, indexed)
space_idUUID пространства (indexed)
UNIQUE(user_id, document_id)