Files
mdm-ordinis/docs/integration/api/read-endpoints.md
T
Zimin A.N. d5268b9395 docs: Diplodoc setup + полное руководство интеграции по API
Новая документация-as-code на платформе Diplodoc (Yandex open-source) с
YFM (Yandex Flavored Markdown). Build → static HTML, deployable куда угодно.

Что добавлено:
- package.json + .yfm + toc.yaml — Diplodoc setup, навигация для sidebar
- index.md — главная страница с tabs для разных audiences
- README.md — инструкция для contributors

Раздел integration/api/ — 11 страниц про интеграцию consumers:
- index — обзор + глоссарий
- auth — Keycloak service accounts, scope mapping
- read-endpoints — GET /dictionaries, list/by-key, spatial filters
- events — Kafka outbox топики, partition keys, idempotency, DLQ
- webhooks — HMAC, SSRF guard, retry policy, test ping endpoint
- bitemporal — validFrom/validTo + history, future-dated entries, bulk close/export
- x-references — FK syntax, validation errors, scope hiding, orphan scanner, v2 cascade preview
- caching — TTL / push / snapshot strategies, hybrid pattern
- errors — full error code reference (validation/auth/conflict/server), retry strategy
- best-practices — 33 numbered rules для consumers
- bundle-cuod — все 40 справочников с FK графом и сценариями

Обновлены:
- ops/README.md — link на новую integration/api/, убран inline <br>
- ops/slo.md — broken cross-repo links заменены на text references

Build:
  cd docs && pnpm install && pnpm build
  → ./_dist (20 HTML files, 7.1M)
  pnpm serve  # → http://localhost:8088

CI deploy job для GitLab Pages — в roadmap (см. docs/README.md).

Существующий tech/api-integration.md оставлен в toc как legacy
(содержимое мигрировано + расширено в integration/api/).
2026-05-07 23:19:02 +03:00

5.4 KiB
Raw Blame History

Read-side endpoints

Read-API в Ordinis — отдельный deployable (ordinis-read-api, scaled 2× в проде) работающий на Postgres replica. Запросы из read-api не блокируют writer'а.

Base URL:

Среда URL
prod https://ordinis.k8s.264.nstart.cloud/api/v1
staging https://ordinis.k8s.265.nstart.cloud/api/v1

Все endpoints требуют JWT (см. Авторизация).

OpenAPI / Swagger UI

  • Swagger UI: https://ordinis.k8s.264.nstart.cloud/swagger-ui.html
  • Spec JSON: https://ordinis.k8s.264.nstart.cloud/v3/api-docs
  • Spec YAML: https://ordinis.k8s.264.nstart.cloud/v3/api-docs.yaml

Из spec'а можно generate'ить клиент:

openapi-generator-cli generate \
  -i https://ordinis.k8s.264.nstart.cloud/v3/api-docs \
  -g python \
  -o ./altum-backend/clients/ordinis

Поддерживаются: Python, TypeScript, Go, Java, Kotlin, Ruby и др.

GET /api/v1/dictionaries

Список доступных справочников (фильтрован по scope JWT'а).

curl -H "Authorization: Bearer $TOKEN" \
  https://ordinis.k8s.264.nstart.cloud/api/v1/dictionaries

Response:

[
  {
    "name": "spacecraft",
    "displayName": "Космические аппараты",
    "scope": "PUBLIC",
    "schemaVersion": "1.0.0",
    "recordsCount": 4
  },
  {
    "name": "mission",
    "displayName": "Миссии / программы",
    "scope": "PUBLIC",
    "schemaVersion": "1.0.0",
    "recordsCount": 9
  }
]

GET /api/v1/{name}/records

{% note warning %}

БЕЗ префикса /dictionaries/! Read-api сидит на /api/v1/{name}/records. Префикс /api/v1/dictionaries/... — это admin write controller (CRUD), у него нет bulk-list эндпоинта.

{% endnote %}

Активные записи на момент at (default: сейчас).

Параметры

Параметр Тип Пример Назначение
lang string ru-RU, en-US Flatten i18n полей в строку. Короткие ru/en тоже.
at ISO 8601 2026-05-04T12:00:00+03:00 Bitemporal query — активные на момент.
as_scope string PUBLIC,INTERNAL Legacy для anonymous + allowQueryScope=true.

Пример

curl -H "Authorization: Bearer $TOKEN" \
  "https://ordinis.k8s.264.nstart.cloud/api/v1/spacecraft/records?lang=ru-RU"

Response:

[
  {
    "businessKey": "RESURS-P-3",
    "displayKey": "Ресурс-П № 3",
    "scope": "PUBLIC",
    "validFrom": "2025-01-01T00:00:00+03:00",
    "validTo": "9999-12-31T23:59:59+03:00",
    "data": {
      "name": "Ресурс-П № 3",
      "satelliteTypeCode": "EARTH-OBSERVATION-OPTICAL",
      "launchDate": "2024-12-25",
      "status": "active"
    },
    "version": 2
  }
]

Без ?lang (raw i18n)

"name": { "ru-RU": "Ресурс-П № 3", "en-US": "Resurs-P No.3" }

С ?lang=ru-RU:

"name": "Ресурс-П № 3"

Если запрошенного языка нет — fallback к default_locale (обычно ru-RU).

GET /api/v1/{name}/records/{businessKey}

Одна запись. Параметры те же что у list.

curl -H "Authorization: Bearer $TOKEN" \
  "https://ordinis.k8s.264.nstart.cloud/api/v1/spacecraft/records/RESURS-P-3?lang=ru"

404 Not Found — запись либо не существует, либо закрыта на момент at, либо вне scope JWT'а (Ordinis скрывает существование).

GET /api/v1/{name}/records/{businessKey}/history

Все версии записи (включая закрытые) для построения истории изменений в UI.

[
  {
    "version": 1,
    "validFrom": "2024-06-01T00:00:00+03:00",
    "validTo": "2025-01-01T00:00:00+03:00",
    "data": {...},
    "txTime": "2024-06-01T10:23:45+03:00",
    "changedBy": "admin@nstart.space",
    "changeReason": "initial"
  },
  {
    "version": 2,
    "validFrom": "2025-01-01T00:00:00+03:00",
    "validTo": "9999-12-31T23:59:59+03:00",
    "data": {...},
    "txTime": "2024-12-30T14:11:22+03:00",
    "changedBy": "admin@nstart.space",
    "changeReason": "Обновление статуса после успешного запуска"
  }
]

Для consumers history endpoint обычно не нужен — это UI-feature.

Spatial filters (geometry)

Если справочник имеет geometry поля (spacecraft.aoi, mission.coverage_area), поддерживаются bbox + polygon фильтры:

?bbox= (bounding box)

GET /api/v1/spacecraft/records?bbox=37.0,55.0,38.0,56.0

Format: min_lon,min_lat,max_lon,max_lat (WGS84). Возвращает записи где geometry пересекает bbox через PostGIS ST_Intersects + GiST index.

?polygon= (GeoJSON)

GET /api/v1/spacecraft/records?polygon={"type":"Polygon","coordinates":[[[37,55],[38,55],[38,56],[37,56],[37,55]]]}

Polygon — GeoJSON object (URL-encoded). Сложнее bbox, точнее.

Дальше