AiSDocs

AiSDocs

Пользователи работают в библиотеке документов. Directus — только техническая платформа и админка разработчиков.

UI https://rfc.botsaray.com/ Library API https://apirfc.botsaray.com/v1 Admin https://rfc.botsaray.com/admin/ Docs https://apirfc.botsaray.com/docs

Base URL

Для пользовательского сценария и интеграций используйте Library API:

https://apirfc.botsaray.com/v1
https://rfc.botsaray.com/v1   (same-origin для SPA)
UI библиотеки: https://rfc.botsaray.com/. Directus Admin: только https://rfc.botsaray.com/admin/.

Библиотека (UI)

Пять экранов первого этапа:

ЭкранURL
Проекты/
Проект/projects/{slug}
Документ/projects/{slug}/rfc/{doc-slug}
Редактирование.../edit
История версий.../history
В UI нет Cycle ID, Project ID, Parent Entry, Revision No, Slug, Public URL. Токен API задаётся кнопкой «Токен» в шапке.

Library API /v1

Скрывает структуру Directus. Frontend вызывает только эти операции.

GET /v1/projects
POST /v1/projects
GET /v1/projects/{slug}
GET /v1/projects/{slug}/documents
POST /v1/projects/{slug}/documents
{"type":"rfc","title":"...","summary":"...","body_md":"..."}
GET /v1/documents/{id}
POST /v1/documents/{id}/versions
GET /v1/documents/{id}/versions
GET /v1/documents/{id}/versions/{n}
POST /v1/documents/{id}/versions/{n}/restore
POST /v1/documents/{id}/comments
POST /v1/documents/{id}/links
GET /v1/search?q=...
Создание документа само назначает проект, slug, URL, версию 1, автора/даты и хэштеги (#tags). Статусы в ответах — русские: Черновик, На согласовании, Действующий, Устаревший, Архивный.
curl -sS -H "Authorization: Bearer rfc_..." \
  https://apirfc.botsaray.com/v1/projects

Авторизация

Токен из Rfc API Tokens (поле token_secret, вид rfc_...).

Authorization: Bearer <token_secret>
Library API и gatekeeper проверяют scopes (read/create/update) и ACL проектов. Чтение списка проектов через /v1 допускается и без токена (анонимный read). Мутации требуют Bearer.

Health

GET /health

Library API. Без авторизации.

curl -sS https://apirfc.botsaray.com/health
GET /server/health

Gatekeeper / Directus proxy (legacy).

Коллекции (legacy Directus Items)

Базовый путь: /items/{collection} — только для служебных интеграций, не для UI библиотеки.

CollectionНазначение
rfc_projectsРеестр продуктов/контуров (TaskCapitan, Parser, …)
rfc_documentsКаталог RFC (code, title, body, urls)
rfc_hashtagsХештеги
rfc_project_cyclesЦиклы внедрения внутри проекта
rfc_project_entriesИдеи / планы / обсуждения / ревизии / отчёты
rfc_project_entry_linksСсылки entry → RFC / URL / файл
rfc_project_entry_commentsКомментарии к entry

Методы

GET /items/{collection}
GET /items/{collection}/{id}
POST /items/{collection}
PATCH /items/{collection}/{id}
DELETE /items/{collection}/{id}

DELETE на nginx дополнительно защищён basic auth.

Query-параметры

ПараметрПримерСмысл
fieldsid,code,title,statusКакие поля вернуть
filterfilter[status][_eq]=activeФильтр Directus
searchsearch=routerПоиск по searchable-полям
sortsort=-updated_atСортировка
limitlimit=25Лимит (-1 = все, осторожно)
offset / pageoffset=25Пагинация
metameta=filter_countМетаданные ответа

Примеры

Список проектов

curl -sS 'https://apirfc.botsaray.com/items/rfc_projects?fields=id,name,slug,status&limit=50' \
  -H "Authorization: Bearer $TOKEN"

Поиск RFC

curl -sS 'https://apirfc.botsaray.com/items/rfc_documents?search=LLM&fields=id,code,title,status,document_url&limit=20' \
  -H "Authorization: Bearer $TOKEN"

RFC по коду

curl -sS 'https://apirfc.botsaray.com/items/rfc_documents?filter[code][_eq]=RFC_30&fields=id,code,title,body_text,document_url' \
  -H "Authorization: Bearer $TOKEN"

Записи проекта

curl -sS 'https://apirfc.botsaray.com/items/rfc_project_entries?filter[project_id][slug][_eq]=taskcapitan&fields=id,title,slug,entry_type,status,public_url&limit=50' \
  -H "Authorization: Bearer $TOKEN"

Создать entry

curl -sS -X POST 'https://apirfc.botsaray.com/items/rfc_project_entries' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "project_id": 1,
    "entry_type": "idea",
    "title": "Новая идея",
    "slug": "idea-new",
    "summary": "Кратко",
    "body_md": "## Суть\n...",
    "status": "draft",
    "revision_no": 1,
    "metadata_json": {}
  }'

Документы проекта и чат

Всё живёт внутри Rfc Project, не как отдельные «сущности меню». Типы документов — поле entry_type в rfc_project_entries:

entry_typeСмысл
ideaИдея
discussionПредложение / обсуждение
rfc_revisionRFC-концепция (новая или редакция)
planПлан внедрения
reportОтчёт

Уникальный код документа в проекте — slug (уникален в паре project+slug). Публичный URL — public_url (копируй и шарь): https://rfc.botsaray.com/projects/{project-slug}/{slug}

Список документов проекта

curl -sS 'https://apirfc.botsaray.com/items/rfc_project_entries?filter[project_id][slug][_eq]=taskcapitan&fields=id,entry_type,title,slug,status,public_url&sort=-updated_at' \
  -H "Authorization: Bearer $TOKEN"

Чат документа (комментарии)

Чат участников = rfc_project_entry_comments, привязан к конкретному entry через entry_id.

GET /items/rfc_project_entry_comments
curl -sS 'https://apirfc.botsaray.com/items/rfc_project_entry_comments?filter[entry_id][_eq]=1&fields=id,author_name,comment_md,created_at&sort=created_at' \
  -H "Authorization: Bearer $TOKEN"
POST /items/rfc_project_entry_comments
curl -sS -X POST 'https://apirfc.botsaray.com/items/rfc_project_entry_comments' \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
    "entry_id": 1,
    "author_name": "Ivan",
    "comment_md": "Согласен с планом, давайте в цикл 2."
  }'
В админке: открой Rfc Projects → проект → блок Entries (идеи/RFC/планы/отчёты). В карточке entry — Comments (чат) и public_url для копирования. Дочерние коллекции скрыты из бокового меню специально.

Reader URL (браузер)

Человекочитаемые страницы на UI-домене (basic auth reader):

ТипURL
RFC документ https://rfc.botsaray.com/{project-slug}/{rfc-code}
пример: https://rfc.botsaray.com/taskcapitan/RFC_30
Project entry https://rfc.botsaray.com/projects/{project-slug}/{entry-slug}
Админка документа https://rfc.botsaray.com/admin/content/rfc_documents/{id}

Ошибки

HTTPКогда
401Нет/битый Bearer
403Нет прав на коллекцию/действие
404Нет объекта или маршрута
400Невалидный filter/payload

Тело ошибки Directus:

{
  "errors": [
    {
      "message": "...",
      "extensions": { "code": "INVALID_CREDENTIALS" }
    }
  ]
}
Fallback-ответов нет: либо корректный результат, либо явная ошибка.

Админка