Files
2026-06-09 13:40:23 +00:00

39 KiB
Raw Permalink Blame History

Что нового в Ordinis

Список значимых обновлений продукта на понятном языке. Технических подробностей нет — для них есть внутренний CHANGELOG с привязкой к коммитам.

Обновления приходят на твой сервер автоматически при следующем deploy.

2.54.0 (2026-06-09)

Новые возможности

  • Удаление справочника — теперь soft-delete с 7-дневным окном восстановления — раньше «Удалить справочник» физически удалял записи каскадом (recovery только из DB-бэкапа). Теперь backend ставит метку deleted_at = now(), записи и черновики остаются в БД. В течение 7 дней администратор может восстановить справочник: открой URL удалённого справочника → красная карточка «Справочник удалён» с кнопкой «Восстановить справочник» + счётчик дней до автоудаления. После 7 дней backend cron DictionaryPurgeJob (раз в час) физически удаляет cascade — recovery невозможен. Список soft-deleted dicts доступен через GET /api/v1/dictionaries/deleted (admin-only Корзина page — UI в follow-up MR).

2.52.0 (2026-06-05)

Новые возможности

  • Удаление справочника одной кнопкой — в правой info-панели редактора справочника появилась danger-кнопка «Удалить справочник…» (видна только пользователям с ролью admin). При клике — модальное окно с предупреждением: будут soft-deleted ВСЕ записи, drafts, schema-drafts. Если на справочник ссылается другой через x-references — backend возвращает 409 со списком зависимостей, в модалке появляется дополнительная кнопка «Удалить force» (на случай если зависимый справочник нужно поправить отдельно). Audit log + outbox event «DefinitionDeleted» пишутся при пометке — consumers downstream (геопортал, Альтум) получают snapshot для инвалидации кэша.

2.51.2 (2026-06-04)

🐛 Исправления

  • FK reference: целевое поле — выпадающий список вместо free-form ввода — в Schema Builder при настройке поля как FK (x-references) раньше «Целевое поле» был обычным input с placeholder code. Можно было ввести любое имя — UI не проверял существование. На staging получили 6 broken FK где target field = code, а в реальных схемах поля code не было (есть designator, name, etc). При создании записи backend искал по несуществующему полю и возвращал 422 x_references_target_not_found. Теперь target field — Select из реальной схемы целевого справочника (businessKey + все scalar non-localized поля). При смене целевого справочника поле сбрасывается на businessKey (universal identifier). Если в существующей схеме FK указывает на несуществующее поле — Builder показывает красное предупреждение «Поле … отсутствует в схеме …».

2.51.1 (2026-06-02)

🐛 Исправления

  • Админ теперь может self-approve собственный draft — раньше в Reviews при открытии своего pending draft через «Мои» кнопки Approve/Reject были скрыты, виден только Withdraw, даже для пользователей с ролью ordinis:admin. Backend в v2.46 уже пропускал админский override, но фронт не давал кликнуть. Теперь useIsAdmin() с tail-match (admin / ordinis:admin / *-admin / *_admin / *:admin) определяет роль и снимает блокировку UI для всех admin-эквивалентных ролей. В audit log пишется отдельная запись «Admin self-approve override» для compliance trail.

2.51.0 (2026-06-02)

Новые возможности

  • Полная ширина на больших экранах — раньше контент в админке ограничивался шириной 1280px и был центрирован. На мониторах 1920+px по краям оставалось много пустого места. Убрали ограничение — теперь страницы записей справочника, schema editor и audit log используют всю доступную ширину (полезной ширины +33% на 1920px мониторе). Reviews/Settings text-heavy страницы остаются ограниченными (читаемость).

2.50.0 (2026-06-02)

Новые возможности

  • Колонки таблицы — лишние спрятаны по умолчанию — info-dense справочники (spacecraft с 13 полями, ground_station с 10+) переполняли таблицу и приводили к горизонтальному скроллу. Теперь из коробки видны только businessKey, name, scope, validFrom + первые 2 дополнительных scalar поля. Остальные доступны через меню «Колонки» (включил один раз — выбор сохранится в localStorage per справочник).

🐛 Исправления

  • Sticky header + sticky pagination — при вертикальной прокрутке длинного списка записей шапка таблицы (с фильтрами и стрелками сортировки) и кнопки навигации страниц больше не уезжают, они зафиксированы. Не приходится листать вверх/вниз чтобы переключить страницу или отсортировать.
  • Существующие пользователи получают новые defaults — те, кто хоть раз открывал таблицу до этой версии, имели пустое значение hidden в localStorage и продолжали видеть все 13 колонок. Добавили схему версии _v: 2 — старые записи переинициализируются с правильными default-hidden настройками, сортировка preserve.

2.49.0 (2026-06-02)

Новые возможности

  • Все поля схемы доступны как колонки таблицы — раньше в меню «Колонки» попадали только enum и FK-поля справочника. Все остальные scalar-поля (string, number, integer, boolean, date), которые отображаются в drawer редактирования, в таблице выбрать было нельзя. Теперь pool колонок == поля редактирования (1:1).

🐛 Исправления

  • Массовый approve больше не падает с 500 — при выборе нескольких черновиков и нажатии «Approve all» одновременные запросы конфликтовали в Postgres (SERIALIZABLE isolation, SSI canceled-as-pivot). Один из approve выдавал 500, остальные проходили. Добавили retry с exponential backoff (50/100/200ms + jitter) для CannotAcquireLockException — теперь Postgres conflict разрешается прозрачно за 1-3 попытки.

2.48.0 (2026-06-02)

Новые возможности

  • Drawer записи: широкий режим по умолчанию на десктопе — раньше при открытии записи drawer всегда стартовал в узком режиме (520px), на 1920px мониторе с info-dense схемами приходилось каждый раз вручную нажимать кнопку расширения. Теперь при viewport ≥ 1024px drawer открывается в широком режиме (880px) по умолчанию. На мобильных — узкий (520px, полная ширина anyway). Выбор пользователя (явный toggle) побеждает viewport и сохраняется в localStorage.

🐛 Исправления

  • Bundle importer не откатывает user-published schema — раньше при рестарте writer'а сравнение bundle.schemaVersion != db.schemaVersion срабатывало в обе стороны: если пользователь опубликовал через UI новую версию схемы (например 1.1.0), а в bundle manifest осталась 1.0.0, writer на следующем restart перезаписывал DB обратно к старой. Теперь используется semver-aware compare — обновление применяется ТОЛЬКО если bundle строго новее DB. User-published changes сохраняются.

2.47.0 (2026-06-02)

Новые возможности

  • Таблица справочника — сортировка по колонкам и выбор колонок — клик по любому заголовку колонки сортирует по asc → desc → none (NULL-значения всегда в конце). Сортировка numeric-aware (BK-2 < BK-10 < BK-100 для бизнес-ключей). Меню «Колонки» позволяет скрыть/показать любую колонку кроме businessKey (primary identifier). Выбор сохраняется в localStorage per справочник.

2.46.1 (2026-06-02)

🐛 Исправления

  • Admin self-approve разблокирован на уровне БД — в v2.46.0 backend разрешил админу approve собственный draft, но DB CHECK constraint (от старой defense-in-depth) всё равно блокировал INSERT/UPDATE → 500. Constraint убран миграцией 0029. Защита теперь только на Java-уровне через WorkflowRoles.isAdmin().

2.46.0 (2026-06-02)

Новые возможности

  • Админ может self-approve drafts — для small teams без выделенных reviewer'ов админ (роль ordinis:admin или любой tail-match *:admin / *-admin / *_admin) теперь может approve собственный draft. Backend пропускает self_approve_forbidden проверку, в audit log пишется запись «Admin self-approve override: draft=… maker=… reviewer=… (same)» для compliance.

2.45.3 (2026-06-02)

🛡️ Безопасность

  • Backend контейнеры запускаются как non-root — все три backend сервиса (writer, read-api, projection-writer) теперь работают под UID 10001 вместо root. Защита от container escape если злоумышленник захватит JVM.
  • .env файлы добавлены в .gitignore — whitelist для .env.example / .env.template / .env.sample. Защита от случайного коммита credentials.
  • Actuator endpoints — public scope сужен — раньше permitAll() на весь /actuator/** экспонировал potentially sensitive endpoints (env, beans, mappings) для anonymous browse. Теперь permitAll только для health/info/prometheus, остальное denyAll. Defense-in-depth через MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE env override.

2.36.0 (2026-05-17)

Новые возможности

  • Тихие часы — на странице «Уведомления» (/me/notifications/preferences) можно включить окно, например 22:00–08:00 МСК, когда email и express-сообщения не отправляются. Внутренние уведомления в шапке (bell badge) остаются доступны. Часовой пояс выбирается из 12 российских зон + UTC. Окна через полночь поддерживаются.

2.35.0 (2026-05-17)

Новые возможности

  • Bundle hygiene v2 (для интеграторов справочников) — каталог справочников теперь поставляется с manifest.yaml (явный список + метаданные) и ed25519-подписью. Защита от подмены файлов и явный контракт версии для CUOD-handoff. Документация: docs/integration/bundle-format-spec.md и docs/user-guide/bundle-authoring.md.

2.34.0 2.34.1 (2026-05-16)

Новые возможности

  • AI: добавить поле — в редакторе схемы справочника появилась кнопка «AI: добавить поле». Опиши идею простыми словами («email контакт», «дата запуска», «частотный диапазон в МГц») — LLM сгенерирует валидное JSON Schema поле. Можно принять, отредактировать или попросить другой вариант. Работает на shared Vortex (vortex.nstart.cloud, модель qwen2.5:7b). Включается через helm ai.enabled. Rate-limit 30 запросов/мин на IP, circuit breaker на падения.

🐛 Исправления

  • AI endpoint возвращал 500 после деплоя — nginx роутил /api/v1/ai/* через generic fall-through на read-api. Добавлено явное правило к writer (тот же паттерн что для /drafts, /me, /admin).

2.33.0 (2026-05-16)

Новые возможности

  • Шаблоны схем при создании справочника — в окне «Создать справочник», вкладка Schema, появилась grid из 6 готовых шаблонов: Чистая, Космический аппарат, Наземная станция, Антенна, Частотный диапазон, Оператор. Один клик — форма заполнена типовыми полями ДЗЗ-домена. Экономит время на повторяющихся типах объектов.

2.32.0 (2026-05-16)

Новые возможности

  • Метка «Запланировано» в таблице записей — если у записи есть будущая версия (с датой validFrom в будущем), в строке таблицы появляется badge. Видно сразу, не открывая запись.

2.31.0 2.31.5 (2026-05-15 2026-05-16)

Новые возможности

  • Phase B-2 уведомления — матрица 4×3 — на странице «Уведомления» появилась таблица: 4 события (отправлено на ревью / одобрено / отклонено / отозвано) × 3 канала (email / express / telegram). Можно отключить email при approve, оставить email при reject — гранулярно. Express и Telegram пока с пометкой «Скоро» (preferences хранятся для opt-in заранее).
  • TimeTravel — окно в будущее — слайдер истории дотягивается до реальной максимальной даты словаря, включая запланированные версии. Раньше был зажат в «сегодня». К подписям границ добавлен год.
  • Banner и индикатор запланированных записей — над таблицей записей показывается количество future-версий + ближайшая дата ввода. Понятно, что прилетит в следующий квартал.

🐛 Исправления

  • Smart Search возвращал 0 результатов — фильтр scope передавался строчными буквами ('public'), а в БД хранится 'PUBLIC' (CHECK constraint UPPERCASE из миграций 0008/0009). Bug жил 5 месяцев. Теперь поиск работает для всех ролей.
  • Версия в шапке показывала «none»/version возвращал тег без значения, потому что build на main без git-тега. Теперь подхватывает тег из helm chart (например v2.31.2), парсит SHA-суффикс и форматирует.
  • Журнал аудита — 13 типов action — раньше многие типы (DRAFT_PUBLISHED, REVIEWER_ASSIGNED и др.) показывались как enum-имя. Теперь все 13 — русские названия.
  • «Действует с» в редакторе — поле было пустым в create-режиме, выглядело как баг. Теперь предзаполнено текущим временем (now()).
  • QA P3/P4 пакет — 7 косметических багов (i18n, layouts, labels).

♻️ Под капотом

  • CI — Alpine mirror стабилизирован — после drift между Nexus v3.23 APKINDEX и реальными файлами release-jobs ломались на каждом auto-bump. Pinned node:22-alpine3.20 + apk update перед add + sed swap на repo.nstart.cloud. Auto-bump теперь работает без ручного вмешательства. Runbook DevOps: docs-internal/ops/nexus-alpine-mirror.md.

2.30.0 2.30.1 (2026-05-15)

Новые возможности

  • Phase B-2 backend — per-event-type granular preferences API + миграция данных (подготовка к UI-матрице из v2.31).

🐛 Исправления

  • Sidebar для PUBLIC users — outbox / audit / webhooks скрыты (раньше показывали ссылки, при клике — 403).
  • TimeTravel slider — extend до now + 30 дней или future marks (улучшено окончательно в v2.31).

2.29.0 2.29.1 (2026-05-15)

Новые возможности

  • Webhook text-wrap для chat-bot receivers — Mattermost @WebhookBot теперь корректно получает payload (receiver требует {"text":"..."} иначе «неизвестный webhook»). Включается в admin-ui на странице подписки (host allowlist + textWrapHosts).

🐛 Исправления

  • Bell badge glyph — счётчик уведомлений в шапке обрезался по верху. Теперь полностью виден.

2.28.0 2.28.2 (2026-05-15)

Новые возможности

  • Phase B уведомления — backend + UI — per-user channel preferences (email / express / telegram), страница /me/notifications/preferences.

🐛 Исправления

  • Email уведомления не уходили вообще — race между OutboxPoller и dispatcher. Окончательное решение: drop @Modifying из tryClaim + EmailChannel как @Bean, не @Component. Critical fix.
  • HTTP status codeResponseStatusException теперь возвращает корректный код (раньше всё было 500).
  • User-Agent webhook — установлен ordinis-alerts (match Webhook Bot subscription).
  • Actuator — Redis health indicator отключён в writer (не нужен, шумел в /actuator/health).

2.27.0 2.27.13 (2026-05-14 2026-05-15)

Новые возможности

  • Полный цикл уведомлений по schema-draft — после approve/reject автор получает toast (немедленно) + email (через outbox) + bell badge в шапке. Закрывает TODO 7 design-doc'а.

🐛 Исправления

  • Согласования — Mine tab для анонимов — раньше показывал raw AxiosError, теперь dedicated empty state с sign-in CTA.
  • Sidebar — 403 spam в консоли — outbox/webhook badge polling гейтятся на INTERNAL scope. Анонимам не дёргаем.
  • /drafts/active теперь 200 + null для PUBLIC scope (вместо 404 → нет шума в консоли).
  • QueryErrorState везде — все routes теперь используют friendly error UI вместо raw AxiosError dump.
  • 44×44 px touch targets — кнопки достижимы на mobile.
  • Em-dash fallback в UserCell — пустые actor'ы показывают «—» вместо raw UUID.
  • Routing /api/v1/me/* — закрыт 500 на /me/notifications (тот же паттерн что для /ai, /drafts).
  • Defensive /me/notifications — wrap DB ops в try/catch с panic-level логированием.

2.26.0 2.26.1 (2026-05-14)

Новые возможности

  • «Мои» tab в Согласованиях — maker self-tracking со status-фильтром. Видишь свои поданные draft'ы и их текущий статус в одном месте.

2.25.0 2.25.1 (2026-05-14)

Новые возможности

  • Approval UX — inline draft CTA + reviewer diff summary — ревьюер видит сжатый diff в drawer'е, автор получает inline-кнопку «Открыть draft» прямо из таблицы записей.

2.24.0 (2026-05-14)

Новые возможности

  • Audit + outbox для record-draft lifecycle — каждое изменение draft пишется в журнал аудита + outbox event для подписчиков webhook.

🐛 Исправления

  • Approval — закрыты 2 bypass paths (security audit findings).
  • Non-breaking schema changes — теперь применяются inline без полного draft workflow.
  • DictionaryEditorDialog — Save блокируется когда нужен draft workflow (раньше silently сохранял).

2.23.0 2.23.1 (2026-05-14)

Новые возможности

  • UUID → имя пользователя через Keycloak — Phase 1 (persistent DB cache) + Phase 2 (on-demand Keycloak lookup). Везде где раньше торчал UUID actor'а (changelog, events, history, audit), теперь видно имя через UserCell.

2.22.0 2.22.1 (2026-05-14)

Новые возможности

  • Per-dictionary approvalMinRole (Phase 2) — у каждого справочника свой минимальный role для approve. Reviewer с меньшей ролью видит draft, но не может approve.
  • Закрытие записей через draftclose / bulk-close идут через workflow, когда у справочника approvalRequired=true.
  • Scope-gated audit / outbox endpoints — INTERNAL/RESTRICTED scopes гейтят доступ к админ-эндпоинтам.
  • /admin/users/{sub}/display — endpoint для UserCell.

2.21.0 (2026-05-13)

Новые возможности

  • Auto-route create/edit через draft — когда у справочника approvalRequired=true, любое создание/редактирование записи автоматически создаёт draft в workflow.

2.20.0 (2026-05-13)

Новые возможности

  • Schema drafts в «Мои черновики» — теперь там видны не только record drafts, но и schema drafts.

2.19.0 2.19.2 (2026-05-13)

Новые возможности

  • Sidebar /reviews — role-based visibility — пункт меню «Согласования» показывается только пользователям с reviewer-ролью.

🐛 Исправления

  • Чтение ролей из access_token, не id_token — sidebar /reviews был скрыт у reviewer'ов из-за неправильного источника roles claim.
  • Webhook scope_filter — Hibernate ordinal mapping bug + UI toggle для активации подписки.

2.18.0 (2026-05-13)

Новые возможности

  • WorkflowRoles — configurable claim path + ordinis:admin super-role — admin теперь bypass'ит все role-checks (для troubleshooting + emergency edits).

2.17.0 (2026-05-13)

Новые возможности

  • Phase 1d — backend role enforcement для workflow — backend сам проверяет роль на approve/reject (раньше доверяли UI). Closing security gap.

2.16.0 2.16.4 (2026-05-12 2026-05-13)

Новые возможности

  • «Что нового» button в шапке — кнопка открывает modal с этим самым changelog'ом.

🐛 Исправления

  • 404 вместо 500 — несуществующий endpoint теперь возвращает 404 (NoResource / NoHandler exceptions properly mapped).
  • Кнопки в schema draft drawer — RU labels + flow row layout.
  • Sidebar badges — Outbox + Webhooks теперь с реальными счётчиками; audit scope label уточнён.
  • Schema draft — автор display + gate «Отозвать» — кнопка только у maker'а draft'а.
  • CI release — убран [skip ci] из semantic-release commit'ов (auto-bump pipeline теперь запускается).

2.15.0 (2026-05-12)

Новые возможности

  • «Что нового» — первая версия + state.md — wiring под changelog story (полноценный modal добавлен в v2.16.0).

🐛 Исправления

  • Swagger UI на staging — доступно всегда для exploration; на prod env-flagged.
  • Docs build context — copy operator/reviewer/changelog директорий в docker image.

2.14.0 (2026-05-12)

Новые возможности

  • График доставки webhook'ов — на странице webhook-подписки теперь видно историю доставок за последние 24 часа или 7 дней. Можно навести курсор на любой столбик и увидеть, сколько было успешных доставок, retry, и сколько ушло в DLQ.

2.13.0 (2026-05-12)

Новые возможности

  • Поиск в фильтре типов событийу webhook event-type фильтра появилось поле поиска. Можно набрать «Record» и увидеть только относящиеся типы событий, вместо ручного скроллинга через все 11.
  • Выбор диапазона дат — в журнале аудита вместо двух отдельных полей «с» и «по» теперь один календарь, в котором можно отметить начало и конец периода. Удобнее и компактнее.

2.12.0 (2026-05-12)

Новые возможности

  • Подсветка активной секции в редакторе записи — когда в редакторе записи прокручиваешь форму, соответствующий «таб» в верхней панели подсвечивается синим. Удобно, чтобы не теряться в длинных формах.

2.11.0 (2026-05-12)

Новые возможности

  • TimeTravel — реальные данные на момент — во вкладках «Записи на момент» и «Структура и поля» в окне TimeTravel теперь видны фактические данные, а не заглушка «backend pending». Можно посмотреть, как выглядел справочник в любую дату из истории.

2.10.0 (2026-05-12)

Новые возможности

  • Что изменилось — вкладка с реальными изменениями — в окне TimeTravel вкладка «Что изменилось» теперь показывает фактический diff между версиями (добавленные поля, изменённые типы, удалённые свойства), а не пустую заглушку.

🐛 Исправления

  • Понятные сообщения об ошибках — вместо технического «AxiosError: Request failed with status code 503» теперь видишь нормальное «Сервер временно недоступен» с кнопкой «Повторить». Это работает для всех ошибок 4xx/5xx и проблем с сетью.

2.9.0 (2026-05-12)

Новые возможности

  • Статистика webhook-подписок — на странице подписки появились карточки со счётчиками: в очереди, retry, доставлено, в DLQ + общий процент успешных доставок. Видно с одного взгляда, насколько здоров твой webhook.

2.8.0 (2026-05-12)

Новые возможности

  • Редактор схемы прямо в окне создания draft'а — больше не нужно открывать отдельную форму. Окно «Создать schema draft» теперь содержит полноценный JSON-редактор (Monaco) с подсветкой синтаксиса и проверкой схемы налету.
  • Согласования — отдельные вкладки — в разделе «Согласования» (/reviews) появились вкладки «Записи» и «Схемы» со счётчиками. Auto-switch на ту вкладку, где есть что согласовать.
  • Редактирование draft'а без пересоздания — если ревьюер запросил изменения, можешь поправить schema draft inline, без удаления и создания нового. Изменения автоматически возвращают draft в статус «На доработке у автора».
  • Фильтр типов webhook-событий — вместо ввода CSV-строкой теперь multi-select с 11 известными типами событий (RecordCreated, SchemaDraftPublished и др.).

2.7.0 (2026-05-12)

Новые возможности

  • Schema workflow Phase 1c — окно создания schema draft, расширение раздела согласований, контроль прав доступа.

2.6.0 (2026-05-12)

Новые возможности

  • Боковая панель schema draft с действиями — drawer показывает текущий статус draft'а и контекстные кнопки: отправить на ревью, approve, request changes, reject, publish, withdraw, edit. Видишь только те действия, которые доступны на текущем шаге.

2.5.0 (2026-05-12)

Новые возможности

  • Вкладка «История версий» — теперь показывает реальный timeline изменений с иконками по типу события и кнопкой «Сравнить» — открывает модальное окно с before/after JSON. Раньше там была заглушка.

2.4.0 (2026-05-12)

Новые возможности

  • Полное сравнение версий схемы — endpoint позволяет получить before/after любой пары версий схемы для конкретной записи (используется кнопкой «Сравнить» в History tab'е).

🐛 Исправления

  • Слайдер TimeTravel — пометки дат больше не наезжают друг на друга при близких версиях.
  • Кнопки в редакторе записи — кнопка «JSON» теперь видна явно (раньше скрывалась как иконка). Если у записи всего одна версия, показывается подсказка вместо disabled кнопок.

2.3.0-2.0.0 (2026-05-12)

Большой релиз-волна: backend endpoints для полного timeline истории, schema workflow API (8 endpoints с maker-checker согласованием), Diff endpoint, тёмная тема. Подробности — в полном CHANGELOG.