API-пайплайн: рубрики для карточек

Индекс: API-пайплайны — индекс

Цель: отмечать свои карточки рубриками, строить собственное дерево рубрик и просматривать публичные рубрики.

Рубрика — это карточка (card_type: rubric). Вид tag классифицирует карточки; вид place — географический узел (rub.geo-…), он задаётся как location карточки и никогда как тег. Рубрики образуют деревья: рубрика содержит свои подрубрики по порядку.

A. Просмотр публичных рубрик

1. Корни.

POST /v0/search/graph/keyword
{"query": "", "card_type": "rubric", "filters": {"roots_only": true}, "limit": 50}
→ {"hits": [{"card_type": "rubric", "nonce": "447697459225821184", "handle": "rub.iab", "title": "IAB Taxonomies", "kind": "tag", …},
            {"nonce": "447799256720343040", "handle": "rub.isic", "title": "International Standard Industrial Classification (ISIC Rev.4)", …}, …]}

2. Дочерние рубрики.

GET /v0/graph/rubrics/@rub.iab?contained_limit=200&contained_offset=0
→ {"nonce": "447697459225821184", "kind": "tag",
   "contained": [{"card_type": "rubric", "nonce": "…", "title": "Automotive"}, …],
   "contained_next_offset": 200}

Листайте с contained_offset, пока contained_next_offset не станет null. Найти рубрику по слову: {"query": "dental", "card_type": "rubric", "filters": {"kind": "tag"}} в том же поиске.

3. Карточки в рубрике. Поиск с фильтром по рубрике: "filters": {"rubrics": [["<rubric nonce>"]]} (внутренние списки — ИЛИ, внешний — И; rubrics_not исключает).

B. Отметить карточку

Рубрики — это поле карточки. Отправляйте весь список при создании или PATCH; он заменяет предыдущий. Для каждой рубрики, которую добавляет новый список, нужно право отмечать ею (B3); рубрики, которые уже есть на карточке, остаются.

PATCH /v0/my/articles/470000000000000042
{"rubrics": ["<rubric nonce>", "470000000000000077"], "location": "<place nonce>"}

B2. Отметить карточку: добавить и снять за один вызов

Меняйте часть рубрик карточки, не отправляя весь список заново.

PATCH /v0/my/cards/470000000000000042/rubrics
{"add": ["470000000000000081"], "remove": ["470000000000000090"]}
→ {"nonce": "470000000000000042", "card_type": "article",
   "rubrics": ["470000000000000081", "…"], "added": ["470000000000000081"],
   "removed": ["470000000000000079", "470000000000000090"],
   "transitions": [{"parent": "470000000000000078", "from": "470000000000000079", "to": "470000000000000081"}]}

Деревья этапов. Поставьте exclusive_children: true на свою рубрику (при создании или через PATCH), и на карточке она будет принимать только одну дочернюю за раз: добавление дочерней заменяет соседнюю, которая была на карточке. Так удобно вести этапы, например Новый → Связались → Сделка: один вызов на шаг, перескоки разрешены. transitions перечисляет каждый шаг по дереву (from: null — карточка вошла в дерево, to: null — вышла из него).

История. Каждая отметка записывается как изменение: что добавлено и что снято, переходы между этапами, кто и когда.

B3. Кто может отмечать рубрикой

Чтобы добавить рубрику на карточку, нужно право отмечать этой рубрикой. Чтобы снять рубрику, оно не нужно никогда.

C. Ваше собственное дерево рубрик

1. Создание.

POST /v0/my/rubrics
Idempotency-Key: rub-1f3a…
{"title": "Wedding services", "content": "What we offer for weddings.", "language": "en",
 "parent": "470000000000000070"}
→ {"nonce": "470000000000000077", "card_type": "rubric", "kind": "tag", "visibility": "Private", …}

2. Добавление, удаление, порядок подрубрик.

POST   /v0/my/rubrics/{rubric}/{child rubric}   {"seqnum": 3}    → 204   (seqnum optional: default = last)
PATCH  /v0/my/rubrics/{rubric}/{child rubric}   {"seqnum": 0}    → 204   (move)
DELETE /v0/my/rubrics/{rubric}/{child rubric}                    → 204

Обе должны быть рубриками, в которые вы можете писать, и нужно право отмечать родительской рубрикой (B3); цикл отклоняется. Другие карточки так не раскладываются: они несут рубрики в собственном поле rubrics (B).

3. Правка, удаление. PATCH /v0/my/rubrics/{nonce} (title, content, handle, visibility, project, …); DELETE /v0/my/rubrics/{nonce}. Ваши: GET /v0/my/rubrics, GET /v0/my/rubrics/{nonce}.

Что происходит за кадром

Правила (400)

Поверхность API

Эндпоинт Назначение FE ИИ / оракул
POST /v0/search/graph/keyword (card_type: rubric) Найти корни и рубрики да да
GET /v0/graph/rubrics, GET /v0/graph/rubrics/{nonce} Публичные рубрики, дочерние рубрики да да
rubrics, primary_rubrics, location при создании / PATCH карточки Отметить карточку да да
POST /v0/my/rubrics, PATCH/DELETE /v0/my/rubrics/{nonce} Ваши рубрики нет да
POST/PATCH/DELETE /v0/my/rubrics/{nonce}/{child} Добавить, переместить, убрать подрубрики нет да
GET /v0/my/rubrics, GET /v0/my/rubrics/{nonce} Ваши нет да
PATCH /v0/my/cards/{nonce}/rubrics Добавить / снять рубрики за один вызов; переходы этапов нет да

Упомянуто