Files
ayurishchevandClaude Opus 5.5 03d727e496 Задачи 025-030: ёмкость префиксов, политика входа, дерево префиксов
Повторный анализ кодовой базы (docs/reviews/2026-09-26-codebase-review-2.md) и доработки:
025 Ёмкость префикса — размер его подсети (а не сумма листьев); «Обзор» считает ёмкость
    по корневым активным IPv4-префиксам и адреса внутри них.
026 Политика блокировки входа: 5 неудач на логин+IP, 20 на IP, 50 на логин со всех IP,
    кроме известных IP (known_logins, миграция 0009) — владельца нельзя заблокировать анонимно.
027 Сериализация попыток входа по IP (advisory-lock после блокировки логина).
028 UI «Префиксы»: загрузка всех страниц (до 20 000), счётчики по total, предупреждение об усечении.
029 Advisory-lock по VRF для операций, меняющих дерево префиксов и раскладку адресов.
030 Исправление замечаний ревью 025-029: _lock_prefix (VRF блокируется до чтения префикса,
    409 при одновременном переносе), константы политики входа перенесены в app/services.py.

Тесты: 14 passed (проверка ёмкости родителя приведена к семантике 025); сквозные сценарии
и гонки — docs/reviews/2026-09-26-changes-025-029-review.md, 2026-09-27-changes-030-review.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 08:28:50 +03:00

2.4 KiB

Экран «Префиксы»: без молчаливого усечения (изменение 028)

Находка № 3 из docs/reviews/2026-09-26-codebase-review-2.md, серьёзность — низкая.

Context

screens.prefixes и screens.address (web/app.js) запрашивают /prefixes?organization_id=…&limit=1000 одной страницей. Заголовок («N префиксов»), вкладка «Все» и подвал показывают all.length (число загруженных), а не total. Родительский список в «Новом префиксе», хлебные крошки экрана адресов и размер по умолчанию в «Добавить вложенный (авто)» строятся по усечённому набору. Организация, в которой /22 разбит на /30, быстро превышает 1 000 префиксов.

Решение (web/app.js, только UI)

  1. Функция loadPrefixes(orgId): загружает все страницы /prefixes (limit=1000, offset += 1000) до total, но не больше PREFIX_UI_CAP = 20000 префиксов; возвращает { items, total }. Страницы запрашиваются последовательно (порядок ORDER BY vrf_id, prefix стабилен).
  2. screens.prefixes и screens.address используют loadPrefixes вместо одиночного запроса.
  3. Заголовок, вкладка «Все» и подвал используют total. Если items.length < total (сработал PREFIX_UI_CAP), над таблицей — информационная строка «Загружено X из N префиксов — уточните поиск или выберите VRF» (стиль .info).
  4. Бэкенд не меняется.
  5. README.md, раздел «Поведение таблиц UI»: одна фраза о загрузке всех страниц и пределе 20 000.

Файлы

web/app.js, README.md.

Проверка

node --check web/app.js; на стенде временная организация с 1 100 префиксами (/30 через POST …/subnets/next) — в UI заголовок «1 101 префикс», все строки доступны. Данные после проверки удалить.