POST /api/spaces/:id/edges — Добавить связь
Сгенерировано из матриц + кода. Правки вносить в источники (
docs/matrices/,server/routes/), не здесь.
| Поле | Значение |
|---|---|
| HTTP | POST /api/spaces/:id/edges |
| Auth | requireSpacemanOrOrgAdmin — requireSpacemanOrOrgAdmin |
| Scope токена | read_write |
| PG-функции | api.add_space_edge |
| Таблицы | space_edge_overlay |
| SRM | SRM-261 |
| RP (права) | — |
| Файл роута | server/routes/spaces.js |
| Статус | done |
Аргументы запроса (best-effort из хендлера; путь-параметры опущены):
| Аргумент | Где | Обяз. | Заметка |
|---|---|---|---|
source_id | body | подтвердить | |
target_id | body | подтвердить |
Коды ответов/ошибок (из хендлера): 400 (+ 200) — уточнить причины вручную
Для человека
Как открыть: вкладка «Спейсы» → откройте спейс → «Настройки спейса» → раздел «Связи» → добавьте связь, указав блок-источник и блок-приёмник.
Добавляет связь между двумя блоками графа этого спейса: источник → приёмник. Связь живёт в оверлее спейса и не трогает саму коллекцию. Логика умная: если такой связи в коллекции нет — она добавляется как кастомная (помечается op=add); если связь в коллекции была, но раньше вы её в спейсе скрыли — добавление просто снимает скрытие, и связь снова видна. Связь блока с самим собой и связь между несуществующими блоками не пройдут.
Кто может. Только менеджер спейса (спейсмен) и администратор организации (RP-132). Сотрудник и наблюдатель связи не меняют. Точные правила — RP.
Для агента
Запись — нужен токен со scope read_write (см. Конвенции). Вызов идёт под ролью владельца токена: добавить связь сможет только токен спейсмена этого спейса или org_admin его организации — иначе route-guard requireSpacemanOrOrgAdmin вернёт 403. Путь занесён в write-allowlist agent-gate как SPACE_EDGE_ADD (server/auth/agentGate.js), и именно эта exact-match запись и есть граница доступа: PG-функция своей проверки прав не делает.
Путь-параметр: :id — UUID спейса.
Тело запроса (JSON):
| Поле | Тип | Обяз. | Назначение |
|---|---|---|---|
source_id | string | да | id блока-источника спейса |
target_id | string | да | id блока-приёмника спейса |
source_id и target_id — это id блоков спейса из списка блоков. Оба обязательны: без любого из них — 400 ({"error":"source_id и target_id обязательны"}).
Пример запроса:
curl -X POST https://specbuilder.vnimanie.ai/api/spaces/f9e8d7c6-.../edges \ -H "Authorization: Bearer tak_..." \ -H "Content-Type: application/json" \ -d '{"source_id":"FEATURE_STORE","target_id":"MODEL_TRAINING"}'Ответ 200:
{ "ok": true }Коды ошибок: 400 — нет source_id/target_id, либо источник равен приёмнику (INVALID_EDGE), либо такого блока в спейсе нет (BLOCK_NOT_FOUND); 403 — роль не позволяет. Ответ — всегда JSON ({ ok: true }); Markdown-зеркала и ETag у мутации нет. Проверить результат можно перечитав список связей.