Commit Graph

805 Commits

Author SHA1 Message Date
Zimin A.N. cd5ee1fcf6 feat(cuod): остальные FK — country, industry_sector, frequency_band
Pass 2 по тому же паттерну. Все target-словари существуют, FK-валидация
на бэке уже работает — просто помечаем поля чтобы admin-UI рендерил
picker вместо free-text.

Изменения:
- mission.country               → x-references country.code
- spacecraft.country            → x-references country.code
- consumer.industry_sector      → x-references industry_sector.code
- consumer.country              → x-references country.code
- antenna.supported_bands.items → x-references frequency_band.code

Schema bumps:
- spacecraft 2.0.0 → 2.1.0
- mission    1.1.0 (без доп. bump'а — country добавляется в этот же релиз)
- consumer   1.0.0 → 1.1.0
- antenna    1.0.0 → 1.1.0
- bundle     1.3.4 → 1.3.5

Skip: spacecraft.spectrum_bands (enum смешивает оптику и радиодиапазоны —
нет одного словаря-target'а; разделение на два поля — отдельная задача).
2026-05-25 14:18:34 +03:00
Zimin A.N. fd7d7d4535 feat(cuod): mission.spacecraft_codes — FK на spacecraft.designator
Зеркало правки в instrument.spacecraft_codes (MR !257). Список КА программы
теперь рендерится в admin-UI как MultiSelect с поиском по designator
(2014-037A — Ресурс-П №2) вместо comma-separated «businessKey'и из spacecraft».

mission schemaVersion 1.0.0 → 1.1.0, bundle 1.3.3 → 1.3.4.
bundleUpdateExistingSchema=true (MR !90) докатит schema_json на рестарте writer'а.
2026-05-25 14:14:44 +03:00
semantic-release-bot 99fabc3245 chore(release): v2.40.0
## [2.40.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.39.0...v2.40.0) (2026-05-25)

###  Features

* **admin-ui,cuod:** array-FK picker для instrument ([1cb0d86](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/1cb0d868c867dc9b48dec4de06602e7bffee21b4))
2026-05-25 10:47:40 +00:00
Александр Зимин 028c9bd637 Merge branch 'feat/array-fk-multi-picker' into 'main'
feat(admin-ui,cuod): array-FK picker для instrument

See merge request 2-6/2-6-4/terravault/ordinis!257
2026-05-25 10:39:00 +00:00
Zimin A.N. 1cb0d868c8 feat(admin-ui,cuod): array-FK picker для instrument
Три массива в instrument были comma-separated текстом с подсказкой
«businessKey'и из X». Пользователь не знал что туда вписать — справочника
доступных значений рядом нет.

UI: добавлен ReferenceMultiSelectField — array-аналог ReferenceSelectField.
Триггер — `items["x-references"]` на string-массиве. Под капотом — готовый
MultiSelect (popover + cmdk-поиск). Fallback на comma-separated TextInput
сохраняется когда target dict недоступен (scope-hide / 403 / 404), сервер
всё равно валидирует FK через ReferenceValidator.

Schema:
- spacecraft_codes      → items.x-references: spacecraft.designator
- supported_format_codes → items.x-references: data_format.code
- supported_level_codes  → items.x-references: processing_level.code

instrument schemaVersion 1.0.0 → 1.1.0, bundle 1.3.2 → 1.3.3 —
CuodBundleImporter перепишет schema_json в БД на старте writer'а,
admin-ui подхватит свежую схему через /api/v1/dictionaries/instrument.

Tests: 2 новых кейса в SchemaDrivenForm.test.tsx — happy path (MultiSelect
рендерится, запрос ушёл на правильный dict) + fallback (comma-separated
с подсказкой «список недоступен»). 171/171 passed.
2026-05-25 13:28:03 +03:00
semantic-release-bot 1ea402e7ec chore(release): v2.39.0
## [2.39.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.38.0...v2.39.0) (2026-05-23)

###  Features

* **cuod:** instrument — approvalRequired=true ([af9e76a](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/af9e76a2b5dff3126e6768ddb27b26639062fa12))
2026-05-23 15:51:30 +00:00
Александр Зимин 3da0369682 Merge branch 'feat/instrument-approval-required' into 'main'
feat(cuod): instrument — approvalRequired=true

See merge request 2-6/2-6-4/terravault/ordinis!256
2026-05-23 15:42:54 +00:00
Zimin A.N. af9e76a2b5 feat(cuod): instrument — approvalRequired=true
instrument (Инструменты съёмки) — содержательный каталог полезной
нагрузки, кандидат на review-гейт наравне со spacecraft/ground_station.

На проде approvalRequired уже был true (историческое наследие, не из
бандла), на staging — false. Манифест его не помечал → рассинхрон.
Помечаем в manifest.json: importer при honorApprovalPolicy=true
применит флаг на staging без bump schemaVersion (CuodBundleImporter
строки 140-162). Bundle version 1.3.1 → 1.3.2.
2026-05-22 16:17:43 +03:00
Александр Зимин 1e06b17936 Merge branch 'ci/direct-commit-prod-image-bump' into 'main'
ci: bump infra image.tag прямым коммитом вместо auto-MR

See merge request 2-6/2-6-4/terravault/ordinis!255
2026-05-21 16:32:14 +00:00
Zimin A.N. b76997e170 ci: bump infra image.tag прямым коммитом в main вместо auto-MR
propose-prod-image-bump открывал MR в ordinis-infra на каждый release.
MR никто не мерджил — накопилось 5+ открытых, image.tag в values
отставал на несколько релизов, и infra deploy-prod (helm upgrade -f
values-prod.yaml) откатывал prod на старый образ.

Переименован в commit-prod-image-bump: коммитит bump image.tag в
values-prod.yaml + values-staging.yaml напрямую в infra main с
rebase-retry. Убран промежуточный MR и 405-квирк при merge
вечно-manual инфра-пайплайна. Токену нужна роль Maintainer для
push в protected main (было Developer); api-scope больше не нужен.
2026-05-21 19:25:58 +03:00
semantic-release-bot a77b613efc chore(release): v2.38.0
## [2.38.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.37.4...v2.38.0) (2026-05-21)

###  Features

* **cuod:** spacecraft.mission — x-localized текст → FK на mission.code ([656da8c](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/656da8c9b904ae2da1f0a017c205b8a00e09ddc9))
2026-05-21 13:45:56 +00:00
Александр Зимин d4872c860c Merge branch 'feat/spacecraft-mission-fk' into 'main'
feat: spacecraft.mission — x-localized текст → FK mission.code (+ миграция)

See merge request 2-6/2-6-4/terravault/ordinis!254
2026-05-21 13:37:46 +00:00
Zimin A.N. 656da8c9b9 feat(cuod): spacecraft.mission — x-localized текст → FK на mission.code
mission у КА хранился свободным x-localized текстом (краткое описание),
дублировался, рассинхронизировался, не был связан со справочником
mission (где уже есть программы миссий + поле spacecraft_codes).

Теперь mission — строка-код, x-references → mission.code. Референсная
целостность + единый источник.

Маппинг 14 КА → 9 миссий взят из mission.spacecraft_codes (обратная
связь уже была в данных). Проверено: все 14 мапятся однозначно,
0 пропусков, 0 конфликтов.

- 0027-spacecraft-mission-fk.xml — Liquibase-миграция существующих БД:
  схема + 14 записей одной транзакцией прямым SQL (смена типа поля —
  chicken-and-egg, как 0020 raw SQL минует Envers/outbox; forward-only).
  schema_version → 2.0.0.
- cuod-bundle: spacecraft.schema.json mission → x-references,
  records/spacecraft.records.json — 14 mission → код, manifest 2.0.0.
  Свежие установки получают новую форму сразу.

Caveat: миграция через raw SQL не пишет Envers _AUD и Kafka outbox —
проекции read-api нужно пересобрать после деплоя (как при 0020).
2026-05-21 16:21:46 +03:00
semantic-release-bot 2115212b8a chore(release): v2.37.4
## [2.37.4](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.37.3...v2.37.4) (2026-05-21)

### 🐛 Fixes

* **admin-ui:** хвосты — 404 на CREATE-черновиках + Radix DialogTitle warning ([2a82a87](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/2a82a875c8eb7f12bc6a376b2f1f1f3097bcf096))
2026-05-21 13:11:27 +00:00
Александр Зимин 44587d0bb6 Merge branch 'fix/tails-404-dialogtitle' into 'main'
fix: хвосты — 404 на CREATE-черновиках + Radix DialogTitle warning

See merge request 2-6/2-6-4/terravault/ordinis!253
2026-05-21 13:06:12 +00:00
Zimin A.N. 2a82a875c8 fix(admin-ui): хвосты — 404 на CREATE-черновиках + Radix DialogTitle warning
1. reviews.tsx: ReviewDrawer звал useLiveRecord для ЛЮБОГО черновика,
   включая CREATE. У CREATE-черновика live-записи нет по определению →
   GET /dictionaries/{id}/records/{key} → 404 (красный шум в консоли на
   каждый CREATE-draft). Теперь для CREATE запрос не запускается, блок
   «текущая версия» показывает «нет текущей версии».

2. modal.tsx: Modal рендерил DialogTitle только при наличии prop title.
   Без title Radix писал в консоль «DialogContent requires a DialogTitle»
   + warning про aria-describedby. Теперь Modal всегда рендерит DialogTitle
   (sr-only fallback) и гасит aria-describedby когда описания нет.
2026-05-21 16:05:09 +03:00
semantic-release-bot 7621f0a95f chore(release): v2.37.3
## [2.37.3](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.37.2...v2.37.3) (2026-05-21)

### 🐛 Fixes

* **admin-ui:** «Сохранить» всегда даёт видимый ответ ([b48a5dd](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/b48a5dd94c6752a14505f1b8668747ee5911d5a2))
* **admin-ui:** запись не сохранялась при пустом optional x-localized поле ([dcb5612](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/dcb5612c949dde3c8eaf122673833371b9249a6d))
2026-05-21 12:58:54 +00:00
Александр Зимин 58938704a0 Merge branch 'fix/record-save-localized-null' into 'main'
fix: запись не сохраняется при пустом optional x-localized поле

See merge request 2-6/2-6-4/terravault/ordinis!252
2026-05-21 12:53:20 +00:00
Zimin A.N. b48a5dd94c fix(admin-ui): «Сохранить» всегда даёт видимый ответ
Принцип: клик по «Сохранить» не должен оставаться без реакции.

Раньше submit мог молча оборваться: AJV-ошибка ложилась через setError
на nested-путь (data.<field>.<locale>), а FieldError читает data.<field>
→ ошибка невидима, форма «не реагирует».

Добавлено:
- blockedMsg — состояние с причиной, рендерится видимым Alert сверху
  формы при любой блокировке submit (validFrom/validTo, AJV).
- onInvalid — обработчик RHF handleSubmit на случай когда RHF сам
  блокирует submit (required-поля); тоже ставит blockedMsg.
- scrollIntoView к началу формы — Alert гарантированно в зоне видимости.

Теперь Save либо сохраняет, либо показывает «Не удалось сохранить —
проверьте поля: …». Молчания не будет.
2026-05-21 15:52:06 +03:00
Zimin A.N. dcb5612c94 fix(admin-ui): запись не сохранялась при пустом optional x-localized поле
Симптом: «Сохранить» (create и edit) ничего не делал, ошибок не видно.

Причина: x-localized поле рендерит Controller на каждую локаль
(data.<field>.<locale>). RHF при сабмите реконструирует values из имён
зарегистрированных полей и материализует родительский объект даже когда
исходное значение было null/отсутствовало → optional поле (например
mission) превращалось в { "ru-RU": undefined, "en-US": undefined }.

AJV отвергал undefined-локали ("must be string"), submit() делал return
до onSubmit — запрос не уходил. Ошибка ложилась через setError на
data.<field>.<locale>, а FieldError читает data.<field> → невидима.

Фикс: pruneEmpty() в submit() рекурсивно убирает undefined и опустевшие
объекты из data перед AJV-валидацией и отправкой — нетронутое
optional-поле снова валидируется как «отсутствует». Не трогает
null/''/0/false.

Откат временной диагностики [ordinis-diag] из MR !251.
Regression-тест падает без фикса, проходит с фиксом.
2026-05-21 15:34:18 +03:00
semantic-release-bot ffffacb538 chore(release): v2.37.2
## [2.37.2](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.37.1...v2.37.2) (2026-05-21)

### 🐛 Fixes

* **rest-api:** bean-валидация возвращает 400 вместо 500 ([b6a41f4](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/b6a41f47a8fa1cead1aeefef55848bf8acea1897))

### 📝 Docs

* **api:** локализация — только Accept-Language header (не ?locale= query) ([11b6ca9](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/11b6ca98354b19cf558bb987427cd81668c60827))
* **api:** уточнение — locale работает только на records, не на schema ([ee4f495](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/ee4f4959732272cba310421924d96705b87b62c1))
* **cheatsheet:** добавить конкретные примеры с реальными dicts ([f3c3e33](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/f3c3e33289003f6f07d41af00d79df277f33032b))
* HTML-вариант регламента «что заводить в НСИ» ([20763fe](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/20763feeb173000625c4e5ab23a72b7f4d286d6d)), closes [#B05A2E](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/B05A2E)
* **integration:** регламент НСИ + текст рассылки для интеграторов ([5b96f98](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/5b96f98fb81e1c6148b1cbe10c0813a5e8c173e6))
* **quickstart:** добавить Приложение A · Cheat Sheet ([5eecfda](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/5eecfdaad57793966a2cbc38b035efb16b756bfa))
* **toc:** + bundle-format-spec.md (fixes Diplodoc build — link unreachable) ([8025320](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/802532057b5282ce4c20788bee099aeaa234c5bb))
* **toc:** зарегистрировать quickstart + cheatsheet + регламент в Diplodoc nav ([3365e94](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/3365e9462a3495546cd444a75019b756799f5901))
2026-05-21 10:38:49 +00:00
Александр Зимин 4d9732c383 Merge branch 'fix/record-save-diagnostics' into 'main'
fix: запись не сохраняется — диагностика + bean-валидация 400

See merge request 2-6/2-6-4/terravault/ordinis!251
2026-05-21 10:31:06 +00:00
Zimin A.N. bc426a9975 chore(admin-ui): диагностическая инструментация сохранения записи [TEMP]
ВРЕМЕННО — для поиска причины «Save ничего не делает». Откатить
после диагностики (все логи помечены [ordinis-diag]).

SchemaDrivenForm: console.warn в submit() — событие формы, RHF
onInvalid, результат AJV, ветки return, вызов onSubmit.
dictionaries.$name: логи в route.handleSubmit + createMut/updateMut
mutate + onSuccess/onError со статусом ответа.

Также добавлен постоянный регресс-тест: повторный submit после
исправления валидации вызывает onSubmit.
2026-05-21 13:28:38 +03:00
Zimin A.N. b6a41f47a8 fix(rest-api): bean-валидация возвращает 400 вместо 500
GlobalExceptionHandler не имел @ExceptionHandler для
MethodArgumentNotValidException — провал bean-валидации @Valid
@RequestBody (@NotBlank businessKey, @NotNull data и т.п.) падал в
generic Exception catch → HTTP 500 internal_error с пустым traceId.

admin-ui на создании/редактировании записи получал бесполезный
«Internal server error» без полей вместо 400 с пофайловой разбивкой.

Добавлен handler → 400 validation_failed с FieldError-списком.
Покрыто GlobalExceptionHandlerTest.
2026-05-21 13:28:25 +03:00
Александр Зимин db7aab0bdb Merge branch 'docs/register-new-docs-in-toc' into 'main'
docs(toc): добавить quickstart/cheatsheet/регламент в /docs nav

See merge request 2-6/2-6-4/terravault/ordinis!250
2026-05-20 16:24:28 +00:00
Zimin A.N. 802532057b docs(toc): + bundle-format-spec.md (fixes Diplodoc build — link unreachable) 2026-05-20 19:13:40 +03:00
Zimin A.N. 3365e9462a docs(toc): зарегистрировать quickstart + cheatsheet + регламент в Diplodoc nav
Файлы лежат в docs/integration/ с прошлых MR (!243, !247, !248), но в
toc.yaml не были включены — Diplodoc не строил их в /docs nav, и
пользователи могли попасть на них только по прямой ссылке.

Добавил три entries в секцию «Интеграция по API» сверху списка:
- 🚀 Quick Start (15 минут) → api-quickstart.md
- 📋 Cheat Sheet → api-cheatsheet.md
-  Регламент — что заводить в НСИ → dictionary-criteria.md

После merge ordinis-docs container пересоберётся, и в admin UI ссылка
"Docs" (top-right) откроет страницу с этими entries в left nav.
2026-05-20 19:09:51 +03:00
Александр Зимин 358712d242 Merge branch 'docs/regulation-html' into 'main'
docs: HTML-вариант регламента (standalone, brand-styled)

See merge request 2-6/2-6-4/terravault/ordinis!249
2026-05-20 15:52:47 +00:00
Zimin A.N. 20763feeb1 docs: HTML-вариант регламента «что заводить в НСИ»
Single-file standalone document (~23 KB). Embed CSS, no external deps.
Brand-consistent с PPTX/Postman — Warm Terracotta palette (#B05A2E),
Georgia headings + Inter body. Responsive (mobile breakpoint 640px),
print-friendly (page-break-inside на cards/tables).

Структура:
- Hero (dark navy + orange stripe + TL;DR callout)
- 5 положительных критериев (green left-border, ✓ glyph, hint boxes)
- 6 anti-patterns (pink left-border, ✗ glyph, symptom captions)
- 10-пунктный чек-лист (terracotta card, numbered orange circles)
- Процесс создания (3 секции × numbered steps)
- Schema conventions
- Final anti-patterns callouts
- Контакты footer

Use case: открыть в браузере, share через corp portal,
print PDF для офлайн-чтения. Markdown-версия остаётся для git-history
и в quickstart Приложение A.
2026-05-20 18:39:22 +03:00
Александр Зимин 20bd912081 Merge branch 'docs/dictionary-criteria-and-announcement' into 'main'
docs: регламент НСИ + текст рассылки для интеграторов

See merge request 2-6/2-6-4/terravault/ordinis!248
2026-05-20 14:19:37 +00:00
Zimin A.N. 5b96f98fb8 docs(integration): регламент НСИ + текст рассылки для интеграторов
* dictionary-criteria.md — decision framework "что заводить в НСИ":
  - 5 положительных критериев (shared, slow change, validity windows,
    audit-trail, structured schema) с min-3-из-5 threshold
  - 6 anti-patterns (transactional, high-freq mutations, derived data,
    PII без ACL, BLOBs, single-consumer данные)
  - 10-пунктный чек-лист (≥7 yes → заводи, < — обсуди)
  - Процесс создания (simple + approval-required + миграция)
  - Schema conventions (businessKey, x-localized, x-references etc)
  - Anti-patterns с примерами из практики

* email-announcement.md — текст рассылки команде:
  - URLs (prod/staging/Swagger/docs)
  - Что внутри Ordinis (37 dicts, REST API, локализация, audit, workflow)
  - С чего начать (Quick Start, Cheat Sheet, Postman, presentation)
  - 60-second smoke командой
  - Roadmap Q3
  - Plain-text вариант для систем без markdown

Both files готовы к публикации: regulation идёт в integrator docs (link
из email), letter — в Mattermost / email-рассылку.
2026-05-20 17:10:03 +03:00
Александр Зимин aa93879a72 Merge branch 'docs/embed-cheatsheet-as-appendix' into 'main'
docs(quickstart): встроить cheatsheet как Приложение A

See merge request 2-6/2-6-4/terravault/ordinis!247
2026-05-20 11:06:01 +00:00
Zimin A.N. 5eecfdaad5 docs(quickstart): добавить Приложение A · Cheat Sheet
Cheatsheet был отдельным файлом — теперь дополнительно встроен в
api-quickstart.md как Приложение A. Reasoning:

* Single source — интегратор открывает quickstart один раз, дальше
  живёт в приложении (search в одном файле, не прыгает между двумя)
* Standalone api-cheatsheet.md сохранён для прямых ссылок и Postman README
* Section 13 обновлён: ссылка на Приложение + Postman collection
* Из appended body убраны self-references и дубликаты

Размер: 587 → 874 строк (+287 — cheatsheet body).
2026-05-20 13:50:55 +03:00
Александр Зимин d21c135cfb Merge branch 'docs/cheatsheet-real-examples' into 'main'
docs(cheatsheet): real examples — FK dep, locale switch, time-travel

See merge request 2-6/2-6-4/terravault/ordinis!246
2026-05-20 08:52:58 +00:00
Zimin A.N. f3c3e33289 docs(cheatsheet): добавить конкретные примеры с реальными dicts
После Postman demo audit — в cheatsheet не хватало живых примеров,
которые можно скопировать и сразу проверить. Добавил:

* FK-зависимость:
  GET /dictionaries/satellite_type/dependents →
  [{sourceDict: spacecraft, sourceField: satellite_type_code,
    onClose: BLOCK, activeRecordsInSourceDict: 14}]
  + список других живых FK на staging (ground_station, country etc).

* Локализация записи через Accept-Language:
  ru: НАСА / Глобальный мониторинг суши и атмосферы
  en: NASA / Global land and atmosphere monitoring
  + warning что ?locale= игнорируется и schema endpoint вообще
  не локализуется.

* Time-travel: 14.05.2026 12:00 → 200, 14.05.2026 00:00 → 404
  record_not_active (ожидаемое поведение, не bug).

* History и changelog/diff живые примеры с test1.

Также убрал password-grant из Auth (используется client_credentials —
это правильный flow для server-to-server интеграторов). И добавил
dependents проверку в 60-second smoke.
2026-05-20 11:52:04 +03:00
Александр Зимин 648b0fdf52 Merge branch 'docs/locale-schema-gap' into 'main'
docs(api): locale работает только на records, не на schema

See merge request 2-6/2-6-4/terravault/ordinis!245
2026-05-20 08:49:38 +00:00
Zimin A.N. ee4f495973 docs(api): уточнение — locale работает только на records, не на schema
Tested: GET /dictionaries/spacecraft с Accept-Language: en-US возвращает
schemaJson с descriptions на ru (defaultLocale). Header игнорируется на
этом endpoint.

Локализация (Accept-Language header) работает только на records-side
(read-api DictionaryReadController). DictionaryDefinitionController
(writer/ordinis-app) возвращает schema без locale negotiation.

Cheatsheet обновлён, добавлен warning в query-params секцию.
2026-05-20 11:46:41 +03:00
Александр Зимин b13b11eaae Merge branch 'docs/locale-header-only' into 'main'
docs(api): локализация — только Accept-Language header

See merge request 2-6/2-6-4/terravault/ordinis!244
2026-05-20 08:41:05 +00:00
Zimin A.N. 11b6ca9835 docs(api): локализация — только Accept-Language header (не ?locale= query)
После testing на staging выявлено: backend парсит локаль ТОЛЬКО из
Accept-Language header. ?locale=en-US query param сейчас игнорируется
(сервер возвращает default ru-RU вне зависимости от значения).

Реальный demo (spacecraft/1999-068A):
  default (без header):           operator: "НАСА"
  Accept-Language: en-US:         operator: "NASA"
  ?locale=en-US (без header):     operator: "НАСА"  ← не работает

Cheatsheet + quickstart обновлены. Postman collection тоже (используется
header). ?locale= query — отдельный backend feature request в roadmap.
2026-05-20 11:40:19 +03:00
semantic-release-bot c1f87d638e chore(release): v2.37.1
## [2.37.1](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.37.0...v2.37.1) (2026-05-19)

### 🐛 Fixes

* **snapshots:** handle Instant return from pgJDBC 42.7+ (was 500) ([d908feb](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/d908febc91524c03b83a34b0e5b2a0ac9c7c4f4b))

### 📝 Docs

* **api:** cheatsheet + quickstart sync с реальным API после Postman audit ([ae05e17](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/ae05e17f96c4410ddd95c0a51c6364c4707df1bd))
* **api:** Quick Start guide + Cheat Sheet для интеграторов ([04e8251](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/04e82519415015a71f9db1ea0e55268f031b4c21))
2026-05-19 20:31:20 +00:00
Александр Зимин a62073bdbe Merge branch 'docs/cheatsheet-fixes' into 'main'
docs(api): cheatsheet + quickstart sync с реальным API

See merge request 2-6/2-6-4/terravault/ordinis!243
2026-05-19 20:23:58 +00:00
Zimin A.N. ae05e17f96 docs(api): cheatsheet + quickstart sync с реальным API после Postman audit
Audit Postman collection выявил расхождения docs ↔ runtime — фикс:

Topology clarification:
- Records (consumer) — БЕЗ /dictionaries/ префикса: /api/v1/{name}/records
- History/cascade-preview/changelog/drafts — С /dictionaries/ (writer audit)
- export-selected.csv — POST, не GET

Query params (records list, /{name}/records):
-  as_scope (required, CSV) — было документировано как ?scope= (неверно)
-  at (ISO timestamp) — было ?asOf= (неверно)
-  locale + Accept-Language header
-  bbox / polygon (geo)
-  убраны: ?limit, ?offset (pagination отсутствует),
            ?status/?country (нет ad-hoc filtering по schema полям)

Snapshots params:
-  from / to / granularity (hour/day/week) — было ?asOf= (неверно)

Base URLs:
- prod: ordinis.nstart.cloud (public LE-cert)
- staging: ordinis.k8s.265.nstart.cloud (Swagger UI здесь)
- было: ordinis.k8s.264.nstart.cloud (устаревший internal, prod переехал)

Version: v2.36 → v2.37.x.

Refs MR !242 (snapshots backend fix), Postman collection в
~/Desktop/Ordinis-Postman/.
2026-05-19 23:15:40 +03:00
Александр Зимин 64a15048f4 Merge branch 'fix/snapshots-timestamp-cast' into 'main'
fix(snapshots): handle Instant return from pgJDBC 42.7+ (был 500)

See merge request 2-6/2-6-4/terravault/ordinis!242
2026-05-19 20:06:22 +00:00
Zimin A.N. d908febc91 fix(snapshots): handle Instant return from pgJDBC 42.7+ (was 500)
ClassCastException on every GET /api/v1/dictionaries/{name}/snapshots:
  java.lang.ClassCastException: class java.time.Instant cannot be cast
  to class java.sql.Timestamp

Root cause: pgJDBC 42.7+ возвращает timestamptz из native query как
java.time.Instant, а старый код жёстко кастил в java.sql.Timestamp.
42.6 возвращал Timestamp — отсюда и тесты с Timestamp проходили,
а runtime ломался.

Fix: helper `toBucketOffsetDateTime(Object raw, OffsetDateTime now)`
ловит все 3 возможных типа от драйвера:
  - java.sql.Timestamp (pgJDBC 42.6 и ранее)
  - java.time.Instant (pgJDBC 42.7+ — current behavior)
  - java.time.OffsetDateTime (если jdbc.timestamp.return-type=offset-date-time)

При любом другом типе бросаем IllegalStateException — fail-loud вместо
silent CCE на каждом запросе.

Tests:
  + snapshots_acceptsInstantFromPg42_7Driver — regression на конкретный
    bug (Instant from current driver)
  + snapshots_acceptsOffsetDateTime — defensive coverage
  + snapshots_rejectsUnexpectedTimestampType — fail-loud branch

Existing tests (с Timestamp) сохранены для backward-compat.
2026-05-19 23:01:37 +03:00
Александр Зимин 9f032e9b5d Merge branch 'docs/api-quickstart-cheatsheet' into 'main'
docs(api): Quick Start guide + Cheat Sheet для интеграторов

See merge request 2-6/2-6-4/terravault/ordinis!241
2026-05-17 13:14:33 +00:00
Александр Зимин 04e8251941 docs(api): Quick Start guide + Cheat Sheet для интеграторов 2026-05-17 13:14:33 +00:00
semantic-release-bot 2f06b408b8 chore(release): v2.37.0
## [2.37.0](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/compare/v2.36.0...v2.37.0) (2026-05-17)

###  Features

* **graph:** добавлен поиск по справочникам в Graph view ([d7de1eb](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/d7de1eb7404f3d51c61a01724a37a32a3e108203))

### 🐛 Fixes

* **admin-ui:** QA report sweep — modal/table layout, i18n, sidebar polish ([239cecd](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/239cecd2426480d3a2237c7961b56064a0e41346)), closes [#1](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/1) [#2](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/2) [#3](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/3) [#4](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/4) [#5](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/5) [#6](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/6) [#7](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/7) [#8](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/issues/8)

### 📝 Docs

* **changelog:** fill 22-release gap v2.15.0 → v2.36.0 ([a600664](https://git.nstart.cloud/2-6/2-6-4/terravault/ordinis/commit/a6006642900bfc34e37554994f5394e6ff39398e))
2026-05-17 12:45:50 +00:00
Александр Зимин 37c9ae7040 Merge branch 'fix/qa-report-sweep' into 'main'
fix(admin-ui): QA report sweep — modal/table layout, i18n, sidebar polish

See merge request 2-6/2-6-4/terravault/ordinis!239
2026-05-17 12:37:29 +00:00
Александр Зимин dd84e57030 Merge branch 'feat/graph-search' into 'main'
feat(graph): поиск по справочникам в Graph view

See merge request 2-6/2-6-4/terravault/ordinis!240
2026-05-17 12:37:06 +00:00
Zimin A.N. d7de1eb740 feat(graph): добавлен поиск по справочникам в Graph view
Top-left dark-glass input на странице /graph. Substring match
case-insensitive по name + displayName (admin помнит либо
technical id `antenna`, либо русское название `Антенны`).

UX:
- Matched nodes остаются в full opacity, остальные dim'ятся (0.25) —
  как при hover-focus. Force-layout не трогаем (positions стабильны).
- При единственном match → matched node получает focused border
  (orange accent + glow) — легко найти результат.
- Edges светятся только когда оба конца — match. Иначе dim.
- Counter chip `N из M` под input'ом + `ничего не найдено` для empty.
- Esc clears query и снимает focus. ✕-кнопка тоже clears (focus
  остаётся на input).
- Search dominates над hover dim — non-matched nodes остаются dim
  даже если hover их затрагивает.

i18n: graph.search.placeholder / .empty / .count для ru-RU и en-US.

Force-simulation не пересчитываем при изменении query — это намеренно.
Иначе nodes прыгали бы по экрану на каждый символ, ломая spatial
recognition (юзер уже привык где какой node лежит).
2026-05-17 15:36:06 +03:00