Files
MikrotikManager/docs/ux-ui-stage-11b.md
T

9.2 KiB

Этап 11Б: сбор данных, оповещения и настройки

ReUI PRO/base-nova; существующие Frame, Data Grid v9, KpiStatGrid, Sheet. Последовательные блоки, локальные коммиты без push. Этап 11А принят локально в 11А.33.

Область Референс Схема и результат
Сбор данных / scheduler Settings 16, Data Grid Filtering 2 Источник → свежесть → настройки/журнал → подтверждённый запуск
Оповещения Stats 12, Sheet 8 Правило → фактическое состояние → адресат → подтверждённая отправка
Интеграции / настройки Settings 16 Секция → сохранённое состояние/черновик → проверка соединения → результат
Релизы List 9 Текущая сборка → доступные сведения → понятный переход
[Источник / права] → [Независимые подтверждённые данные]
                           ↓
[Черновик настроек] → [Действие] → [API receipt]
                           ↓             ↓
                   [Ошибка/unknown]   [Снимок результата]
                           └──────→ [Отдельное обновление]
Порядок Раздел / исходные файлы Выявленная проблема Точка завершения
1 backend scheduler.ts / routes/scheduler.ts Безусловный ok и повторная запись после journal failure Один collector/одна запись, partial/fatal явно сохранены (11Б.1)
2 lib/scheduler-run-snapshot.ts, data-collection/page.tsx PostgreSQL JSONB объект обрабатывается как строка Object и legacy JSON отображаются без падения
3 data-collection/page.tsx Общий Promise.allSettled задерживает быстрые зависимости; refresh сбрасывает drafts; числа нормализуются; run-now receipt игнорируется Strict API, независимые known/error/time, сохранённые формы, lock/права/контекст
4 alerts/page.tsx / routes/alerts.ts Зависимости/CRUD/отправка требуют профильного аудита Правило/получатель/частичный результат/без повторной отправки при неизвестности
5 settings/page.tsx, Evolution/NetFlow интеграции Секреты, сохранение, test/refresh и сообщения требуют аудита Проверка сохранённой конфигурации, черновик и подтверждённый результат раздельны
6 releases/page.tsx Проверить фактические сведения сборки/переходы Семантическая оболочка, пустой/unknown, ПК/390/320
7 probes расписание, общая приёмка Осталось после этапа 10 Настройки расписания/результат, профильная регрессия/снимки/build

Границы: данные наблюдения offline/down не заменять ошибкой сборщика; записанные samples и доставка Telegram — разные результаты. Не менять сетевые правила и права. Локальные DI/HTTP фикстуры не доказывают PostgreSQL транзакции, RouterOS, реальную доставку Telegram/Portal и долговечную идемпотентность.

Блок 11Б.1 — общий scheduler runner и карта оставшихся разделов (2026-10-01)

  • Collector вызывается один раз, результат записывается одной попыткой. Fatal/errors snapshot даёт status=error с сохранёнными счётчиками/снимком; partial отмечается текстом «Завершено с ограничениями». Наблюдаемое down/offline само по себе не является ошибкой выполнения коллектора. Skipped/not-due не порождают событие о выполненной работе.
  • Ошибки event/hook отделены от результата. Отказ run journal не создаёт вторую запись; выдаётся явная ошибка подтверждения журнала с предупреждением о повторных операциях. Ручной API возвращает ok=false/result для partial и отдельный statusError при отказе чтения статуса после подтверждённого запуска.
  • 9 runner + 4 HTTP теста, backend/contracts build и ESLint изменённых файлов прошли. Общий npm --prefix backend test завершился с кодом 0; DB-зависимые тесты пропущены из-за недоступного PostgreSQL, это не проверка транзакций с реальной DB.
  • Карта/референсы/схема оставшегося этапа сохранены в ux-ui-stage-11b.md. UI сбора данных пока не читает новый receipt строго; JSONB resultJson ошибочно ожидается строкой (raw.trim может выбросить ошибку). Следующий небольшой блок исправляет совместимость JSONB/legacy JSON; полные reader/state/операции — после него.
  • Следующий блок 11Б.2: отображение object/legacy snapshot в общем журнале без падения, затем 11Б.3 строгие API и независимые состояния/черновики сбора данных. Этап 11Б/12 не принят, реальные DB/RouterOS/Telegram/Portal остаются внешней приёмкой.

Блок 11Б.2 — JSONB и legacy snapshot общего журнала (2026-10-01)

  • resultJson читается как unknown: PostgreSQL JSONB объект и старый строковый JSON проходят общий decoder. Больше нет raw.trim на объекте. Проверены версия/известная задача/время/обязательные поля верхнего уровня; backup counts и новые diagnostics валидируются без подстановки нулей.
  • Снимок другого job не отображается в выбранной записи. Некорректный/неподдерживаемый снимок показывает Alert «Снимок недоступен», отсутствие снимка остаётся отдельным состоянием. Полная валидация вложенных строк остальных коллекций ещё относится к строгому API следующего блока.
  • 4 unit, 4 E2E object/legacy/invalid/foreign, TypeScript и production frontend/contracts build прошли. ESLint parser/DTO/tests прошёл. На общей странице остаются 2 исходные set-state-in-effect ошибки и 2 warnings: отдельный lint HEAD через stdin подтвердил ту же исходную базу; их исправление входит в reader/context блока 11Б.3.
  • Первый E2E прогон использовал неполную GeoIP фикстуру и падал в старом GeoipSettingsSection. Фикстура уточнена; NetFlow зависимость вынесена в явный HTTP 503 вместо неверного success DTO. Повторные 4 E2E прошли без pageerror. Строгий GeoIP reader/guard также необходим в 11Б, реальная интеграция не принята.
  • ReUI audit checklist получен; существующий Alert/вариант warning, текстовый рендер и структура сохранены. Весь раздел сбора данных ещё не прошёл визуальную/доступностную приёмку.
  • Следующий блок 11Б.3: строгие scheduler/collector API, независимые reader states, dirty drafts и контекст/права; новый run-now receipt пока не обрабатывается страницей строго.