fix(cuod+docs): Resurs-P/Канопус/Метеор/Электро/Арктика в seed + правильный read-api путь

Альтум-команда обнаружила что /api/v1/dictionaries/{name}/records даёт 500
и spacecraft_codes ссылаются на несуществующий "RESURS-P-3". Оба бага мои:

1. Read-api живёт на /api/v1/{name}/records (БЕЗ /dictionaries/ префикса).
   /dictionaries/* — это admin-write контроллер, у него GET-list нет.
   Fix: docs/integration/altum-imaging-order.md + docs/tech/api-integration.md
   обновлены с правильными URL'ами + примером ответа из live staging.

2. spacecraft seed имел только 4 КА (Terra, Sentinel-1A/2A, Кондор-ФКА),
   а mission.spacecraft_codes ссылался на пустые/RESURS-P-3 — каскад в
   "Заказ съёмки" не работал бы.
   Fix: добавлено 10 российских КА (Ресурс-П 1-4, Канопус-В 1+5, Метеор-М 2+2-2,
   Электро-Л 2, Арктика-М 1) с COSPAR designators как businessKey.

3. mission.records.json + instrument.records.json: spacecraft_codes теперь
   ссылается на реально существующие COSPAR-ключи. Каскад работает:
   instrument MSU-MR → spacecraft [2014-037A, 2019-038A] → Метеор-М № 2 / 2-2.

После redeploy и идемпотентного пересева:
  spacecraft   14 (было 4, +10 РФ)
  mission       9 (existing 9, references фиксированы)
  instrument   11 (было 10, +МСУ-ГСМ Арктики)
This commit is contained in:
Zimin A.N.
2026-05-04 18:27:36 +03:00
parent 578fe8f476
commit 2fc9b451e4
5 changed files with 238 additions and 35 deletions
+33 -19
View File
@@ -34,43 +34,57 @@ instrument / processing_level / data_format пока отсутствуют в
**Endpoints (read-only):**
```
GET /dictionaries
→ список доступных справочников.
> ⚠️ **Read-api живёт без префикса `/dictionaries/`** — это admin-write путь.
> Для чтения используйте `/api/v1/{name}/records` напрямую.
GET /dictionaries/{name}/records?lang=ru&at=2026-05-04T12:00:00Z
```
GET /api/v1/dictionaries
→ список доступных справочников (только метаданные + JSON Schema).
GET /api/v1/{name}/records?lang=ru-RU&at=2026-05-04T12:00:00Z
→ активные записи на момент `at` (default: now).
?lang=ru/en — i18n поля приходят строкой на выбранном языке.
?lang=ru-RU / ?lang=en-US — i18n поля сворачиваются в строку на этом языке.
Без ?lang — i18n остаётся объектом {ru-RU, en-US}, BFF может flatten сам.
GET /dictionaries/{name}/records/{businessKey}?lang=ru&at=...
GET /api/v1/{name}/records/{businessKey}?lang=ru-RU&at=...
→ одна запись по businessKey.
GET /api/v1/{name}/records/{businessKey}/history
→ все версии записи (закрытые + текущая).
```
**Пример:**
**Пример (есть на staging прямо сейчас):**
```bash
curl https://ordinis.k8s.265.nstart.cloud/api/v1/dictionaries/spacecraft/records?lang=ru
curl https://ordinis.k8s.265.nstart.cloud/api/v1/spacecraft/records?lang=ru-RU
```
```json
[
{
"businessKey": "RESURS-P-3",
"validFrom": "2025-01-01T00:00:00+03:00",
"validTo": "9999-12-31T23:59:59+00:00",
"id": "72a15bec-56f6-4fb6-8e85-d91a492c707e",
"businessKey": "1999-068A",
"data": {
"code": "RESURS-P-3",
"name": "Ресурс-П № 3",
"norad_id": 41386,
"satellite_type": "OPTICAL",
"launched_at": "2016-03-13",
"operator": "ROSCOSMOS",
"status": "ACTIVE"
}
"name": "Terra (EOS AM-1)",
"country": "US",
"operator": "НАСА",
"norad_id": 25994,
"designator": "1999-068A",
"launch_date": "1999-12-18",
"status": "ACTIVE",
"satellite_type_code": "OPT_MIDRES_MS",
"spectrum_bands": ["VIS", "NIR", "SWIR", "TIR"]
},
"validFrom": "2026-05-03T20:49:09Z",
"validTo": "9999-12-31T23:59:59Z"
}
]
```
**businessKey формат:** для существующих spacecraft — COSPAR designator
(например `2016-016A` = Ресурс-П № 3). Для остальных справочников — code-style
(`RESURS_P`, `MSI-S2`, `GEOTIFF`, `L1A`).
## 3. Согласованные схемы 4 справочников
Все справочники имеют общую базовую структуру: `code` (string, businessKey),
+21 -5
View File
@@ -95,26 +95,42 @@ curl -H "Authorization: Bearer $TOKEN" \
]
```
### `GET /api/v1/dictionaries/{name}/records`
### `GET /api/v1/{name}/records`
> ⚠️ **БЕЗ префикса `/dictionaries/`!** Read-api сидит на `/api/v1/{name}/records`.
> `/api/v1/dictionaries/...` — это admin-write контроллер для CRUD, у него нет
> bulk-list эндпоинта, не пытайтесь его читать.
Активные записи на момент `at` (default: `now`). Параметры:
| параметр | тип | пример | примечание |
|----------|-----------|------------------------------|------------------------------------------------|
| `lang` | string | `ru`, `en` | flatten i18n полей до строки на этом языке |
| `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` | для anonymous + `allowQueryScope=true` (legacy) |
```bash
curl -H "Authorization: Bearer $TOKEN" \
"https://ordinis.k8s.265.nstart.cloud/api/v1/dictionaries/spacecraft/records?lang=ru"
"https://ordinis.k8s.265.nstart.cloud/api/v1/spacecraft/records?lang=ru-RU"
```
### `GET /api/v1/dictionaries/{name}/records/{businessKey}`
Без `?lang` ответ возвращает локализованные поля как объект:
```json
"name": { "ru-RU": "Ресурс-П № 3", "en-US": "Resurs-P No.3" }
```
С `?lang=ru-RU`:
```json
"name": "Ресурс-П № 3"
```
### `GET /api/v1/{name}/records/{businessKey}`
Одна запись. Параметры те же.
### `GET /api/v1/dictionaries/{name}/records/{businessKey}/history`
### `GET /api/v1/{name}/records/{businessKey}/history`
Все версии записи (включая закрытые). Используется UI-историей, для consumer'ов
обычно не нужно.