27 lines
3.9 KiB
Markdown
27 lines
3.9 KiB
Markdown
# Суммаризация: журнал — поиск, ротация, очистка, 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` отдельно не ограничиваются; рост от подбора паролей сдерживает ротация.
|
||
|
|
- Экспорт журнала и управление пользователями не входят.
|