Files
ipam_control/docs/changes/003-journal-search-rotation/SUMMARY.md
T
ayurishchevandClaude Sonnet 5 a846d30872 IPAM Manager: API, UI-админка, журнал аудита
Backend (FastAPI, SQLAlchemy 2, Alembic, PostgreSQL 16):
- организации, VRF, префиксы (дерево, использование, автоназначение),
  адреса, операторы связи, устройства и типы устройств; JWT, роли admin/viewer;
- VRF принадлежит организации (составной FK), смена VRF у префикса
  переносит поддерево, имя VRF уникально в организации;
- журнал аудита: поиск и фильтры, ротация (срок/количество), очистка
  по паролю с блокировкой, IP клиента и метаданные запроса
  (X-Forwarded-For только от TRUSTED_PROXIES).

UI (web/, без сборки): экраны и диалоги по макетам «IPAM Manager»,
кликабельные строки реестров, локальные шрифты IBM Plex,
собственные выпадающие списки.

Окружение: docker-compose (postgres + app), миграции Alembic 0001-0004,
scripts/gen_env.py, scripts/seed_demo.py, 11 автотестов (pytest).
Документация: README.md и docs/changes/001-005 (планы и итоги).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 12:27:47 +03:00

3.9 KiB

Суммаризация: журнал — поиск, ротация, очистка, UI (изменение 003)

Сделано

  • БД (миграция 0003): audit_log + uid (UUID) и message (бэкфилл существующих записей), индекс (entity_type, action); таблицы app_settings (настройки ротации, по умолчанию 90 дней / 100 000 записей) и clear_attempts (неудачные попытки очистки). Проверено: upgrade → check (без дрейфа) → downgrade → upgrade.
  • API: GET /audit с поиском и фильтрами (текст/ID, тип события, сущность, актор, период UTC, «Показать ещё»), /audit/summary, /audit/facets, /audit/{uid}; GET|PUT /journal/settings; POST /journal/clear (пароль, 5 попыток / блокировка 10 минут).
  • Ротация: app/rotation.py — по сроку и по количеству; фоновая задача раз в час и сразу при сохранении настроек; PG advisory lock; сводная запись journal.rotated (итог после ротации не превышает лимит). Экранирование спецсимволов LIKE в поиске.
  • События: добавлены session.login / session.failed, journal.settings_updated / rotated / cleared; у каждой записи человекочитаемое сообщение.
  • UI: экран «Журнал» по макету Journal (строка «N записей · старейшая … · ротация …», фильтры Тип/Актор/Сущность/период/поиск, таблица, «Показать ещё 100»), окно записи (ID с копированием, данные JSON), окно «Настройки журнала», окно «Очистить журнал» (кнопка неактивна без пароля, счётчик попыток, блокировка). Настройки и очистка видны только admin.

Проверка

  • 9 автотестов (3 новых: поиск и фильтры; ротация по сроку и по количеству; очистка — неверный пароль и блокировка на временном пользователе) — 9 passed (дважды подряд).
  • Сценарий UI в браузере: фильтры, поиск, период, окно записи, копирование, настройки, ротация до 50 записей, неверный пароль → счётчик → блокировка, успешная очистка (остаётся одна запись journal.cleared), ошибок JS нет. Успешная очистка проверена на пересозданной БД; после проверки БД снова заполнена демо-данными.
  • Сверка с макетами Journal / JournalEntry / JournalSettings / JournalClear (они нарисованы для ROS Manager): сетка, размеры, цвета, состояния совпадают; отличия — предметные: колонка «Сущность» вместо «Устройство», типы событий IPAM.

Допущения и ограничения

  • Запись journal.rotated создаётся только если что-то удалено.
  • Формат поля даты (input type=date) зависит от локали браузера (в макете — ISO).
  • Записи auth.failed отдельно не ограничиваются; рост от подбора паролей сдерживает ротация.
  • Экспорт журнала и управление пользователями не входят.